Класс не может быть встроен. Вместо этого используйте соответствующий интерфейс

Я использую WIA для захвата изображения со сканера в форму Windows. Вот код, который я использую:

private void button2_Click(object sender, EventArgs e)
{
    const string wiaFormatJPEG = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}";
    CommonDialogClass wiaDiag = new CommonDialogClass();
    WIA.ImageFile wiaImage = null;

    wiaImage = wiaDiag.ShowAcquireImage(
            WiaDeviceType.UnspecifiedDeviceType,
            WiaImageIntent.GrayscaleIntent,
            WiaImageBias.MaximizeQuality,
            wiaFormatJPEG, true, true, false);

    WIA.Vector vector = wiaImage.FileData;

    Image i = Image.FromStream(new MemoryStream((byte[])vector.get_BinaryData()));
    i.Save(@"D:\prueba1.jpeg");
}

При попытке запустить этот небольшой тест я получаю эту ошибку:

Тип взаимодействия «WIA.CommonDialogClass» не может быть внедрен. Вместо этого используйте соответствующий интерфейс.

И это:

«WIA.CommonDialogClass» не содержит определения для «ShowAcquireImage», и не может быть найден метод расширения «ShowAcquireImage», принимающий первый аргумент типа «WIA.CommonDialogClass» (вам не хватает директивы использования или ссылки на сборку?

Я предполагаю, что вторая ошибка возникает из-за первой ошибки, верно?

Любые предложения о том, как это исправить?


person Community    schedule 18.11.2010    source источник
comment
Я обнаружил, что CommonDialogClass работает в .NET 3.5, а проблема, с которой вы столкнулись, появилась в более поздних версиях.   -  person Kyle Delaney    schedule 14.04.2017


Ответы (3)


Вторая ошибка вызвана первой. Функция Embed Interop Types поддерживает только встраивание интерфейсов, но не классов. Помимо установки для этой опции в ссылке WIA значения False и развертывания библиотеки взаимодействия, вы также можете исправить это следующим образом:

 WIA.CommonDialog wiaDiag = new WIA.CommonDialog();

Разрешено неинтуитивное, но создание COM-интерфейсов с помощью оператора new. Вам нужно добавить префикс имени пространства имен, потому что CommonDialog неоднозначен с классом Winforms CommonDialog.

person Hans Passant    schedule 18.11.2010
comment
Нереально! Он работает почти как класс dynamic в том смысле, что вы не получаете intellisense ни для одной из операций, но на самом деле он работает так, как ожидалось. Спасибо друг! - person Mike Perrenoud; 04.10.2012

http://digital.ni.com/public.nsf/allkb/4EA929B78B5718238625789D0071F307

Эта ошибка возникает из-за того, что значением по умолчанию является true для свойства Embed Interop Types сборки TestStand API Interop, на которую ссылается новый проект. Чтобы устранить эту ошибку, измените значение свойства Embed Interop Types на False, выполнив следующие действия.

Select the TestStand Interop Assembly reference in the references section of your project in the Solution Explorer.
Find the Embed Interop Types property in the Property Browser, and change the value to False

Ссылки по теме: База знаний 595FQJPI: Могу ли я использовать Visual Studio 2010 с модулями кода TestStand и Call .NET Framework 4.0?

person Ramezani r    schedule 10.06.2013

Просто вы просто выбираете сборку ошибок в панели решений/ссылках. Затем нажмите Alt-Enter (Свойства), найдите «Тип взаимодействия для встраивания» и установите для него значение «False», если оно True Brgs!

person Duy    schedule 02.08.2014