Interop类型无法嵌入

Jan*_*Jan 648 c# visual-studio-2010 visual-studio c#-4.0

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

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

无法嵌入Interop类型'ActiveHomeScriptLib.ActiveHomeClass'.请改用适用的界面.

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

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

Jon*_*eet 1039

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

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

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

  • 我在Project的属性页面而不是右键单击| "引用"窗格中受影响的DLL上的属性. (126认同)
  • 如错误所说并"使用适用的界面"那样做是否更有意义?我有这个错误(来自不同的类)并且能够实例化一个接口,该接口将该类指定为其CoClass属性,并且它有效.正如Michael Gustus在下面的回答中所说,BlahClass的界面刚刚被称为Blah,它似乎是标准惯例. (4认同)
  • 不幸的是,这听起来就像我需要的,但这个属性似乎不再可用. (2认同)

小智 469

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

Excel.ApplicationClass xlapp = new Excel.ApplicationClass();
Run Code Online (Sandbox Code Playgroud)

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

Excel.Application xlapp = new Excel.Application();
Run Code Online (Sandbox Code Playgroud)

MSDN的解释在这里.

  • +1我相信这是错误信息实际上告诉你在"使用适用的界面"时要做的事情.请注意,Excel.Application是一个接口(尽管它可以使用new关键字进行实例化,类似于此处描述的情况:http://stackoverflow.com/questions/6960910/what-does-the-c-sharp -coclass-attribute-do) (14认同)

gid*_*eon 120

和Jan一样,我花了一段时间才得到它... = S所以对于那些因挫败感而蒙羞的人.

  • 右键单击您在项目" 参考"下的解决方案资源管理器中添加的有问题的程序集.(在我看来是WIA)
  • 单击属性.
  • Embed Interop Assembly应该有选项.
  • 将其设置为False

  • 仍在努力,直到我意识到你必须**在解决方案资源管理器中的项目参考项目下右键单击互操作程序集**,******你正在构建的程序集! (15认同)
  • 现在,(十年后)这个选项被称为“嵌入互操作类型” (3认同)

Jar*_*Par 32

扩展Jon的正确答案.

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

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


VK_*_*217 31

这里是在Visual Studio 2012中设置Embed Interop的地方

在此输入图像描述


小智 14

得到了解决方案

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


Zac*_*ach 9

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

WshShellClass shellClass = new WshShellClass();
Run Code Online (Sandbox Code Playgroud)

对此......

WshShell shellClass = new WshShell();
Run Code Online (Sandbox Code Playgroud)

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