Тип interop неможливо вставити


667

Я створюю веб-додаток на .NET 4.0 (beta2) у C #.

Коли я намагаюся використовувати збірку під назвою "ActiveHomeScriptLib", я отримую таку помилку:

Тип interop "ActiveHomeScriptLib.ActiveHomeClass" неможливо вставити. Використовуйте замість цього відповідний інтерфейс.

Коли я змінюю рамку на версію 3.5, у мене немає помилок.

Що таке тип Interop і чому це відбувається лише тоді, коли я використовую рамку 4.0?


Я вважаю цю статтю дуже корисною для вирішення проблем interop / PIA. blogs.msdn.com/b/vbteam/archive/2010/06/11/…
GilesDMiddleton

Відповіді:


1068

.NET 4.0 дозволяє первинним інтеропним збіркам (а точніше - бітам, які вам потрібні) вбудовувати у вашу збірку, так що вам не потрібно розгортати їх поряд зі своїм додатком.

З будь-якої причини цю збірку неможливо вбудувати - але це здається, що для вас це не проблема. Просто відкрийте вкладку "Властивості" для складання в Visual Studio 2010 і встановіть для "Вставити типи інтеропа" на "Неправильно".

EDIT: Дивіться також Майкл Gustus в відповідь , видаляючи Classсуфікс з типів , які ви використовуєте.


2
На жаль, це звучить як те, що мені потрібно, але ця властивість, здається, більше не доступна.
Дейв

130
Я шукав на сторінці властивостей Проекту замість правої кнопки миші | Властивості ефективної DLL на панелі "Посилання".
justSteve

5
Хіба не було б більше сенсу робити так, як говорить помилка та "використовувати відповідний інтерфейс"? У мене була ця помилка (від іншого класу) і я міг створити інтерфейс, який вказав цей клас як його атрибут CoClass, і він працював. Як і у відповіді Майкла Густуса нижче, інтерфейс для BlahClass називався Blah, що, здається, є стандартною умовою.
Тім Гудман

1
Чудова річ щодо вбудовування - це те, що збірка Interop може залишатися CopyLocal = хибною, оскільки вона вам не потрібна під час виконання.
Шмулі

@TimGoodman для мене "застосовний інтерфейс" не працював, але налаштування вищезгаданого embed interop typesвластивості falseзробила трюк. У моєму випадку - я працював з Microsoft.Office.Interop.Excelбібліотекою і мені був потрібен доступ до об'єкта Workbook. Використання його інтерфейсу Workbook(btw. Іменування конвенції ...) не було варіантом - я отримав COM object, не бажанийMicrosoft.Office.Interop.Excel.WorkbookClass
Prokurors

484

У більшості випадків ця помилка є результатом коду, який намагається створити об'єкт 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/… )
Тім Гудман,

"Вставити типи Interop" у "False" або "True" ?
Кікенет

1
@Kiquenet, якщо дотримуватися порад тут, ви можете встановити "Embed Interop Types" на "True" або, принаймні, для мене це нормально
Сем Холдер

122

Як і Ян, мені знадобилося певний час, щоб отримати це .. = S Так для всіх, хто засліплений розчаруванням.

  • Клацніть правою кнопкою миші правопорушну збірку, яку ви додали в провідник рішень у розділі Посилання на проект . (У моєму випадку WIA)
  • Клацніть властивості.
  • І там має бути варіант для Embed Interop Assembly.
  • Встановіть його на помилкове

15
Досі не вдається, поки я не зрозумів, що вам потрібно клацнути правою кнопкою миші збірку interop відповідно до проекту «Посилання» в Провіднику рішень, а не збірці, яку ви будуєте!
SteveWilkinson

2
Тепер (через десять років) цей варіант називається "Embed Interop Types"
Девід Фолі


34

Розгортання правильної відповіді Йона.

Проблема тут полягає в тому, що ви поєднуєте нову функцію "Embed Interop Types" (або NoPIA) з використанням типу класу. Функція "Embed Interop Types" працює, по суті, статично пов'язуючи всі типи від PIA (Primary Interop Assembly) у референтну збірку, видаляючи накладні витрати її розгортання.

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


15

Отримав рішення

Перейдіть до посилань клацніть правою кнопкою миші потрібний dll, ви отримаєте опцію "Embed Interop Types" на "False" або "True".


1
Це також працювало для VS2015 c # з .net, використовуючи PP_COM_Wrapper; наведено в cypress.com Cypress Semiconductor Corporation C # Lib приклад. Якщо встановити значення False, це помилка позбулася.
користувач3564895

9

Я зіткнувся з цим питанням, перетягуючи проект TFS на свою локальну машину. Нібито це добре працювало на машині хлопця, який його написав. Я просто змінив це ...

WshShellClass shellClass = new WshShellClass();

До цього...

WshShell shellClass = new WshShell();

Тепер він працює як чемпіон!


1
Цей підхід спрацював і для мене! У моєму випадку я налагоджував, щоб знайти місце, де мені потрібне значення, клацнув правою кнопкою миші та вибрав "копіювати вираз". Мені було надано "... HTMLDocumentClass ..." Видалення тексту "Клас" з нього вирішило проблему для мене.
majestzim

3

У VB.NET 2013 у мене була така ж проблема з Office 2007, і це вирішило її:

VS 2013 VB.NET Project> Реквізити> Відгуки> Microsoft Word 12.0 Lib Object> Embed Interop Type: change True to False


1

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

Ця помилка виникає через те, що значення за замовчуванням відповідає справжньому властивості Embed Interop Types у складі TestStand API Interop, на яке посилається в новому проекті. Щоб вирішити цю помилку, змініть значення властивості Embed Interop Type на False, виконавши наступні кроки: Виберіть посилання TestStand Interop Assembly в розділі посилань вашого проекту в Провіднику рішень. Знайдіть властивість Embed Interop Types у веб-переглядачі та змініть значення на False


1

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

Встановлення нижче пакету NuGet вирішить проблему EmbedInteropTypes .

Встановити-пакет Microsoft.VisualStudio.SDK.EmbedInteropTypes

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.