关于C#:不能嵌入互操作类型

Interop type cannot be embedded

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

当我尝试使用名为"ActiveHomeScriptlib"的程序集时,我得到以下错误:

Interop type
'ActiveHomeScriptLib.ActiveHomeClass'
cannot be embedded. Use the applicable
interface instead.

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

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


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

不管什么原因,这个程序集不能被嵌入-但听起来这对你来说不是问题。只需在Visual Studio 2010中打开程序集的"属性"选项卡,并将"嵌入互操作类型"设置为"假"。

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


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

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

通常,在.NET 4中,只需删除"class"后缀并编译代码:

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

这里有一个msdn解释。


像简一样,我花了一段时间才拿到。对于其他因挫折而失明的人来说也是如此。

  • 右键单击在项目引用下的解决方案资源管理器中添加的有问题的程序集。(就我而言,WIA)
  • 单击属性。
  • 并且应该有用于嵌入互操作程序集的选项。
  • 设为假


扩展乔恩的正确答案。

这里的问题是,您正在将新的"嵌入互操作类型"(或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

以下是在Visual Studio 2012中设置嵌入互操作的位置

enter image description here


找到解决方案了

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


当把一个TFS项目拖到本地机器上时,我遇到了这个问题。据说,写这封信的人的机器运转良好。我只是改变了这个…

1
WshShellClass shellClass = new WshShellClass();

对此…

1
WshShell shellClass = new WshShell();

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


我在vb.net 2013和office 2007中遇到了同样的问题,这解决了它:

vs 2013 vb.net项目>props>refs>Microsoft Word 12.0对象库>嵌入互操作类型:将true更改为false


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

出现此错误的原因是,对于新项目中引用的TestStand API互操作程序集的"嵌入互操作类型"属性,默认值为true。要解决此错误,请按照以下步骤将"嵌入互操作类型"属性的值更改为false:在解决方案资源管理器的项目的"引用"部分中选择TestStand Interop程序集引用。在属性浏览器中查找"嵌入互操作类型"属性,并将该值更改为false。