Тип взаимодействия не может быть встроен

668

Я создаю веб-приложение на платформе .NET 4.0 (бета2) в C #.

Когда я пытаюсь использовать сборку под названием «ActiveHomeScriptLib», я получаю следующую ошибку:

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

Когда я меняю фреймворк на версию 3.5, у меня не возникает никаких ошибок.

Что такое тип взаимодействия и почему это происходит только при использовании платформы 4.0?

январь
источник
Я нашел эту статью очень полезной для решения проблем взаимодействия / PIA. blogs.msdn.com/b/vbteam/archive/2010/06/11/…
GilesDMiddleton

Ответы:

1069

.NET 4.0 позволяет встроить основные сборки взаимодействия (точнее, нужные вам биты) в вашу сборку, чтобы вам не нужно было развертывать их вместе с приложением.

По какой-то причине эта сборка не может быть встроена - но, похоже, это не проблема для вас. Просто откройте вкладку «Свойства» для сборки в Visual Studio 2010 и установите для «Встроить типы взаимодействия» значение «Ложь».

РЕДАКТИРОВАТЬ: См. Также ответ Майкла Густуса , удалив Classсуффикс из типов, которые вы используете.

Джон Скит
источник
2
К сожалению, это звучит как то, что мне нужно, но это свойство больше не доступно.
Дэйв
130
Я искал на странице свойств проекта вместо щелчка правой кнопкой мыши | Свойства созданной библиотеки DLL на панели «Ссылки».
JustSteve
5
Разве не имеет смысла поступать так, как говорится в сообщении об ошибке, и «использовать соответствующий интерфейс»? У меня была эта ошибка (из другого класса), и я смог создать интерфейс, в котором этот класс был указан в качестве атрибута CoClass, и это сработало. Как и в ответе Майкла Густуса ниже, интерфейс для BlahClass был просто назван Blah, что, кажется, является стандартным соглашением.
Тим Гудман
1
Отличительной особенностью встраивания является то, что сборка Interop может оставаться CopyLocal = False, поскольку она вам не нужна во время выполнения.
Шмули
@TimGoodman для меня «применимый интерфейс» не работал, но настройка вышеупомянутого embed interop typesсвойства falseсделала свое дело. В моем случае - я работал с Microsoft.Office.Interop.Excelбиблиотекой и мне нужно было получить доступ к объекту Workbook. Использование его интерфейса Workbook(кстати, соглашение об именовании ...) не было вариантом - я получил COM object, а не желаемыйMicrosoft.Office.Interop.Excel.WorkbookClass
Prokurors
485

В большинстве случаев эта ошибка является результатом кода, который пытается создать экземпляр COM-объекта. Например, вот фрагмент кода, запускающий Excel:

Excel.ApplicationClass xlapp = new Excel.ApplicationClass();

Как правило, в .NET 4 вам просто нужно удалить суффикс 'Class' и скомпилировать код:

Excel.Application xlapp = new Excel.Application();

Объяснение MSDN здесь .

Майкл Густус
источник
16
+1 Я верю, что именно это сообщение об ошибке и говорит вам «делать, используя соответствующий интерфейс». Обратите внимание, что Excel.Application - это интерфейс (несмотря на то, что его можно создать с помощью нового ключевого слова, аналогично ситуации, описанной здесь: stackoverflow.com/questions/6960910/… )
Тим Гудман,
«Вставить типы взаимодействия» в «Ложь» или «Истина» ?
Kiquenet
1
@Kiquenet, если вы последуете совету, приведенному здесь, вы можете установить для «Встроить типы взаимодействия» значение «Истина», или, по крайней мере, это сработало для меня
Сэм Холдер,
122

Как Ян Мне потребовалось некоторое время, чтобы получить это .. = S Так что для всех, кто ослеплен разочарованием.

  • Щелкните правой кнопкой мыши на сборке, которая была добавлена ​​в обозревателе решений в разделе « Проекты» . (В моем случае WIA)
  • Нажмите свойства.
  • И там должна быть опция для Embed Interop Assembly.
  • Установите это в Ложь
Гидеон
источник
15
Все еще боролись, пока я не понял, что вам нужно щелкнуть правой кнопкой мыши по сборке взаимодействия под проектом. Ссылки в обозревателе решений, а НЕ сборка, которую вы строите!
Стив Уилкинсон
2
Теперь, (десять лет спустя) этот вариант называется «Вставить типы
Дэвид Фоли
36

Вот где можно установить Embed Interop в Visual Studio 2012

введите описание изображения здесь

VK_217
источник
34

Расширение на правильный ответ Джона.

Проблема здесь в том, что вы комбинируете новую функцию «Embed Interop Types» (или NoPIA) с использованием типа класса. Функция «Embed Interop Types» работает, по сути, статически связывая все типы из PIA (Primary Interop Assembly) со ссылочной сборкой, устраняя накладные расходы на ее развертывание.

Эта функция отлично работает для большинства типов в PIA, но у нее есть ограничения. Одним из них является то, что вы не можете вставлять классы (это проблема обслуживания). У Миши есть подробная статья в блоге о том, почему это запрещено

JaredPar
источник
15

Получил решение

Перейти к ссылкам правой кнопкой мыши на нужной DLL, вы получите вариант «Вставить типы взаимодействия» на «Ложь» или «Истина».

Navdeep
источник
1
Это также работало для VS2015 c # с .net используя PP_COM_Wrapper; приведенный в cypress.com Cypress Semiconductor Corporation C # Lib пример. Установка в False избавила от ошибки.
user3564895
9

Я столкнулся с этой проблемой при переносе проекта TFS на мою локальную машину. Предположительно, это работало отлично на машине парня, который написал это. Я просто изменил это ...

WshShellClass shellClass = new WshShellClass();

К этому...

WshShell shellClass = new WshShell();

Теперь он работает как чемпион!

Zach
источник
1
Этот подход работал и для меня! В моем случае я выполнял отладку, чтобы найти нужное значение, щелкнул правой кнопкой мыши и выбрал «копировать выражение». То, что мне дали, было "... HTMLDocumentClass ...". Удаление текста "Class" из него решило проблему для меня.
Великий
3

У меня была такая же проблема в VB.NET 2013 с Office 2007, и это решило ее:

VS 2013 VB.NET Project> Реквизиты> Ссылки> Microsoft Word 12.0 Object Lib> Встраивать типы взаимодействия: изменить True на False

Дуг Налл
источник
1

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

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

Рамезани р
источник
1

Visual Studio 2017 версии 15.8 позволила использовать синтаксис PackageReferences для ссылки на пакеты NuGet в проектах Visual Studio Extensibility (VSIX). Это значительно упрощает рассуждение о пакетах NuGet и открывает возможность для получения полного метапакета, содержащего весь VSSDK.

Установка ниже NuGet пакета решит проблему EmbedInteropTypes .

Пакет установки Microsoft.VisualStudio.SDK.EmbedInteropTypes

Рахул
источник