Interop类型无法嵌入

时间:2010-03-20 15:47:01

标签: c# visual-studio-2010 visual-studio c#-4.0

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

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

  

互操作类型   'ActiveHomeScriptLib.ActiveHomeClass'   无法嵌入。使用适用的   接口改为。

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

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

10 个答案:

答案 0 :(得分:1006)

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

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

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

答案 1 :(得分:456)

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

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

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

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

MSDN说明是here

答案 2 :(得分:112)

答案 3 :(得分:32)

扩展Jon的正确答案。

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

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

答案 4 :(得分:29)

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

enter image description here

答案 5 :(得分:12)

得到了解决方案

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

答案 6 :(得分:9)

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

null

对此...

WshShellClass shellClass = new WshShellClass();

现在,它就像一个冠军!

答案 7 :(得分:2)

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

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

答案 8 :(得分:1)

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

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

答案 9 :(得分:0)

Visual Studio 2017 version 15.8 made it possible to use the PackageReferencesyntax来引用Visual Studio可扩展性(VSIX)项目中的NuGet包。这样就可以更轻松地推断出NuGet软件包,并为拥有包含整个VSSDK的完整元软件包打开了大门。

在NuGet软件包下面安装将解决 EmbedInteropTypes 问题。

  

安装软件包Microsoft.VisualStudio.SDK.EmbedInteropTypes