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

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

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

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

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

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

9 ответов

Решение

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

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

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

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

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

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

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

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

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

  • Щелкните правой кнопкой мыши на сборке, которая была добавлена ​​в обозревателе решений в разделе " Проекты". (В моем случае WIA)
  • Нажмите свойства.
  • И там должна быть опция для Embed Interop Assembly.
  • Установите это в Ложь

Вот где можно установить встраивание взаимодействия в Visual Studio 2012

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

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

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

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

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

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

WshShellClass shellClass = new WshShellClass();

К этому...

WshShell shellClass = new WshShell();

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

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

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

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.

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

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

Установочный пакет Microsoft.VisualStudio.SDK.EmbedInteropTypes

Другие вопросы по тегам