【问题标题】:Interop type cannot be embedded无法嵌入互操作类型
【发布时间】:2011-01-29 19:57:49
【问题描述】:

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

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

互操作类型 'ActiveHomeScriptLib.ActiveHomeClass' 不能嵌入。使用适用的 界面。

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

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

【问题讨论】:

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


【解决方案1】:

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

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

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

【讨论】:

  • 不幸的是,这听起来正是我所需要的,但这个属性似乎不再可用了。
  • 我正在查看项目的属性页面,而不是右键单击 | “引用”窗格中受影响 DLL 的属性。
  • 按照错误所说的“使用适用的界面”不是更有意义吗?我有这个错误(来自不同的类)并且能够实例化一个接口,该接口将该类指定为其 CoClass 属性,并且它工作。正如下面 Michael Gustus 的回答,BlahClass 的接口只是称为 Blah,这似乎是标准约定。
  • 嵌入的好处在于 Interop 程序集可以保持 CopyLocal=False,因为您在运行时不需要它。
  • @TimGoodman 对我来说“适用接口”不起作用,但将上面提到的 embed interop types 属性设置为 false 就可以了。就我而言 - 我正在使用 Microsoft.Office.Interop.Excel 库并需要访问 Workbook 对象。使用它的接口Workbook(顺便说一句。命名约定......)不是一个选项 - 我收到了COM object,而不是所需的Microsoft.Office.Interop.Excel.WorkbookClass
【解决方案2】:

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

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

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

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

MSDN 的解释是here

【讨论】:

  • +1 我相信这就是错误消息实际上告诉您“使用适用的界面”时要执行的操作。注意 Excel.Application 是一个接口(尽管它可以用 new 关键字实例化,类似于这里描述的情况:stackoverflow.com/questions/6960910/…
  • “嵌入互操作类型”“False”“True” ?
  • @Kiquenet 如果您遵循此处的建议,您可以将“嵌入互操作类型”设置回 True,或者至少对我来说没问题
【解决方案3】:

就像 Jan 我花了一段时间才得到它.. =S 所以对于其他被挫败感蒙蔽双眼的人来说。

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

【讨论】:

  • 一直在苦苦挣扎,直到我意识到您必须在解决方案资源管理器中的项目引用下右键单击互操作程序集不是您的程序集建设!
  • 现在,(十年后)这个选项被称为“嵌入互操作类型”
【解决方案4】:

这里是在 Visual Studio 2012 中设置嵌入互操作的位置

【讨论】:

    【解决方案5】:

    扩展 Jon 的正确答案。

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

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

    【讨论】:

      【解决方案6】:

      解决办法

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

      【讨论】:

      • 这也适用于带有 .net 的 VS2015 c#,使用 PP_COM_Wrapper;在cypress.com Cypress Semiconductor Corporation C# Lib 示例中给出。设置为 False 消除了错误。
      【解决方案7】:

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

      WshShellClass shellClass = new WshShellClass();
      

      到这里……

      WshShell shellClass = new WshShell();
      

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

      【讨论】:

      • 这种方法也适用于我!就我而言,我正在调试以找到我需要的值在哪里,右键单击并选择“复制表达式”。给我的是“...HTMLDocumentClass...”,从中删除文本“Class”为我解决了这个问题。
      【解决方案8】:

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

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

      【讨论】:

        【解决方案9】:

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

        出现此错误是因为新项目中引用的 TestStand API Interop 程序集的 Embed Interop Types 属性的默认值为 true。要解决此错误,请按照以下步骤将 Embed Interop Types 属性的值更改为 False: 在解决方案资源管理器的项目的引用部分中选择 TestStand Interop Assembly 引用。 在属性浏览器中找到 Embed Interop Types 属性,并将值更改为 False

        【讨论】:

          【解决方案10】:

          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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-02-27
            • 2018-06-10
            • 2019-02-02
            • 2023-03-04
            • 2017-10-12
            • 2022-06-17
            • 2015-05-01
            • 2018-12-07
            相关资源
            最近更新 更多