互操作类型不能嵌入

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

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

互操作类型 'Active Home脚本库。Active Home类' 无法嵌入。请使用适用的 接口代替。

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

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

410270 次浏览

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

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

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

扩展乔恩的正确答案。

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

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

就像简我花了一段时间才得到它…=S所以对于那些因沮丧而失明的人来说。

  • 右键单击您在项目参考文献下的解决方案资源管理器中添加的违规程序集。
  • 单击属性。
  • 应该有嵌入互操作程序集。的选项
  • 设置为False

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

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

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

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

MSDN的解释是这里

找到解决办法了

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

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

我在2013年VB.NET使用Office 2007时遇到了同样的问题,这解决了它:

VS 2013VB.NETProject>Props>Refs>Microsoft Word 12.0对象库>嵌入互操作类型:将True更改为False

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

WshShellClass shellClass = new WshShellClass();

为了这个…

WshShell shellClass = new WshShell();

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

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

在此处输入图片描述

Visual Studio 2017版本15.8可以使用PackageRe的引用Visual Studio可扩展性(VSIX)项目中的NuGet包。这使得对NuGet包的推理变得更加简单,并为拥有包含整个VSSDK的完整元包打开了大门。

安装下面的NuGet包将解决嵌入式操作类型问题。

安装包Microsoft.VisualStudio.SDK.EmbedInteropTypes