我正在用c#在。net 4.0框架(beta2)上创建一个web应用程序。
当我尝试使用一个名为“ActiveHomeScriptLib”的程序集时,我得到以下错误:
互操作类型 “ActiveHomeScriptLib。ActiveHomeClass” 不能嵌入。使用适用的 接口。
当我将框架更改到3.5版本时,我没有任何错误。
什么是互操作类型,为什么这只发生在我使用4.0框架时?
我正在用c#在。net 4.0框架(beta2)上创建一个web应用程序。
当我尝试使用一个名为“ActiveHomeScriptLib”的程序集时,我得到以下错误:
互操作类型 “ActiveHomeScriptLib。ActiveHomeClass” 不能嵌入。使用适用的 接口。
当我将框架更改到3.5版本时,我没有任何错误。
什么是互操作类型,为什么这只发生在我使用4.0框架时?
当前回答
扩展Jon的正确答案。
这里的问题是您将新的“嵌入互操作类型”(或NoPIA)特性与类类型的使用结合在一起。“嵌入互操作类型”特性的工作原理基本上是静态地将PIA(主互操作程序集)中的所有类型链接到引用程序集,从而消除了部署它的开销。
这个特性对于PIA中的大多数类型都非常有效,但它也有一些限制。其中之一是您不能嵌入类(这是一个服务问题)。Misha有一篇关于为什么不允许这样做的详细博客文章
http://blogs.msdn.com/mshneer/archive/2009/12/07/interop-type-xxx-cannot-be-embedded-use-the-applicable-interface-instead.aspx
其他回答
在大多数情况下,此错误是试图实例化COM对象的代码的结果。例如,下面是一段启动Excel的代码:
Excel.ApplicationClass xlapp = new Excel.ApplicationClass();
通常,在。net 4中,你只需要删除'Class'后缀并编译代码:
Excel.Application xlapp = new Excel.Application();
MSDN的解释在这里。
我花了一段时间才学会。对于那些被挫折蒙蔽了双眼的人来说。
右键单击您在项目引用下的解决方案资源管理器中添加的出错程序集。(以我为例,WIA) 单击“属性”。 这里应该有嵌入互操作组装的选项。 设置为False
http://digital.ni.com/public.nsf/allkb/4EA929B78B5718238625789D0071F307
发生此错误是因为新项目中引用的TestStand API互操作程序集的Embed Interop Types属性的默认值为true。要解决此错误,请按照以下步骤将Embed Interop Types属性的值更改为False: 在解决方案资源管理器中项目的引用部分中选择TestStand互操作程序集引用。 在属性浏览器中找到Embed Interop Types属性,并将值更改为False
下面是在Visual Studio 2012中设置嵌入互操作的地方
Visual Studio 2017 version 15.8允许在Visual Studio Extensibility (VSIX)项目中使用PackageReferencesyntax来引用NuGet包。这使得推断NuGet包变得更加简单,并为拥有一个包含整个VSSDK的完整元包打开了大门。
安装下面的NuGet包将解决EmbedInteropTypes问题。
安装包Microsoft.VisualStudio.SDK.EmbedInteropTypes