互操作类型无法嵌入


666

我正在用C#在.NET 4.0框架(beta2)上创建一个Web应用程序。

当我尝试使用名为“ ActiveHomeScriptLib”的程序集时,出现以下错误:

无法嵌入互操作类型'ActiveHomeScriptLib.ActiveHomeClass'。请改用适用的界面。

当我将框架更改为版本3.5时,我没有任何错误。

什么是互操作类型?为什么仅在使用4.0框架时才会发生这种情况?


我发现本文对于解决互操作性/ PIA问题非常有帮助。blogs.msdn.com/b/vbteam/archive/2010/06/11/...
GilesDMiddleton

Answers:


1067

.NET 4.0允许将主互操作程序集(或更确切地说,您需要的互操作程序集)嵌入到程序集中,因此您无需将它们与应用程序一起部署。

无论出于何种原因,都无法嵌入该程序集-但是听起来这对您来说不是问题。只需在Visual Studio 2010中打开程序集的“属性”选项卡,然后将“嵌入互操作类型”设置为“ False”。

编辑:另请参阅Michael Gustus的答案Class从您使用的类型中删除后缀。


2
不幸的是,这听起来像我需要的东西,但是该属性似乎不再可用。
戴夫

130
我在查看项目的属性页,而不是右键单击| “引用”窗格中受影响的DLL的属性。
justSteve 2012年

5
如错误所述并“使用适用的接口”,这样做是否更有意义?我遇到了这个错误(来自不同的类),并且能够实例化一个将该类指定为其CoClass属性的接口,并且该接口可以正常工作。就像迈克尔·古斯图斯(Michael Gustus)在下面的回答中一样,BlahClass的接口仅称为Blah,这似乎是标准约定。
Tim Goodman

1
关于嵌入的一个很棒的事情是,Interop程序集可以保持CopyLocal = False,因为在运行时不需要它。
Schmuli 2012年

@TimGoodman对我来说“适用的接口”不起作用,但是设置上述embed interop types属性起到false了作用。就我而言-我正在使用Microsoft.Office.Interop.Excel库,需要访问Workbook对象。使用它的界面Workbook(顺便说一句命名约定...)不是一种选择-我收到的COM object不是所希望的Microsoft.Office.Interop.Excel.WorkbookClass
Prokurors

483

在大多数情况下,此错误是试图实例化COM对象的代码的结果。例如,以下是启动Excel的一段代码:

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

通常,在.NET 4中,您只需要删除'Class'后缀并编译代码:

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

MSDN的解释在这里


16
+1我相信这是错误消息实际上告诉您要执行的操作,它显示“使用适用的界面”。请注意,Excel.Application是一个接口(尽管可以使用new关键字实例化它,类似于此处描述的情况:stackoverflow.com/questions/6960910/…
Tim Goodman

“嵌入互操作类型”“假”“真”
Kiquenet

1
@Kiquenet如果你照做,在这里你可以设置的“嵌入互操作类型”回真,或者至少是对我的工作确定
山姆持有人

122

像Jan一样,我花了一段时间才得到它。.= S所以对于任何对挫折视而不见的人来说。

  • 右键单击在“项目引用”下的解决方案资源管理器中添加的有问题的程序集。(以我为例)
  • 单击属性。
  • 而且应该有嵌入式Interop组件的选项
  • 将其设置为False

15
直到我意识到您必须右键单击“解决方案资源管理器”中“项目引用”下的互操作程序集,而不是您正在构建的程序集时,它仍在努力工作!
SteveWilkinson

2
现在,(十年后)此选项称为“嵌入互操作类型”
David Foley

36

在这里在Visual Studio 2012中设置嵌入互操作

在此处输入图片说明


34

扩展乔恩的正确答案。

这里的问题是您正在将新的“嵌入式互操作类型”(或NoPIA)功能与类类型结合使用。“嵌入式互操作类型”功能通过将所有类型从PIA(主互操作程序集)静态链接到引用程序集而工作,从而消除了部署它的开销。

此功能对PIA中的大多数类型都适用,但确实有一些限制。其中之一是您不能嵌入类(这是一个服务问题)。Misha有一篇详细的博客文章,介绍了为什么不允许这样做


15

得到了解决方案

转到引用,右键单击所需的dll,您将获得“嵌入的互操作类型”选项为“假”或“真”。


1
这也适用于使用PP_COM_Wrapper和.net的VS2015 c#;在cypress.com中给出的 Cypress Semiconductor Corporation C#Lib示例。设置为False消除了错误。
user3564895

9

将TFS项目拉到本地计算机时遇到了这个问题。据称,在编写它的那家伙的机器上运行良好。我只是改变了这个...

WshShellClass shellClass = new WshShellClass();

为此...

WshShell shellClass = new WshShell();

现在,它像冠军一样运作!


1
这种方法也对我有用!就我而言,我正在调试中找到所需的值,右键单击并选择“复制表达式”。给我的是“ ... HTMLDocumentClass ...”从中删除文本“ Class”对我来说解决了这个问题。
majestzim

3

我在带有Office 2007的VB.NET 2013中遇到了相同的问题,此问题得以解决:

VS 2013 VB.NET项目>道具>参考> Microsoft Word 12.0对象库>嵌入互操作类型:将True更改为False


1

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

发生此错误的原因是,新项目中引用的TestStand API Interop程序集的Embed Interop Types属性的默认值为true。若要解决此错误,请按照下列步骤操作,将Embed Interop Types属性的值更改为False:在解决方案资源管理器中,在项目的引用部分中选择TestStand Interop程序集引用。在属性浏览器中找到“嵌入互操作类型”属性,并将其值更改为False。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.