ChatGPT解决这个技术问题 Extra ChatGPT

无法嵌入互操作类型

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

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

无法嵌入互操作类型“ActiveHomeScriptLib.ActiveHomeClass”。请改用适用的接口。

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

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

我发现这篇文章对解决互操作/PIA 问题非常有帮助。 blogs.msdn.com/b/vbteam/archive/2010/06/11/…

C
Community

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

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

编辑:另请参阅 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
C
Callum Watkins

在大多数情况下,此错误是尝试实例化 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/…
“嵌入互操作类型”到“假”或“真”?
@Kiquenet 如果您遵循此处的建议,您可以将“嵌入互操作类型”设置回 True,或者至少对我来说没问题
g
gideon

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

右键单击您在项目引用下的解决方案资源管理器中添加的有问题的程序集。 (在我的情况下是WIA)

单击属性。

并且应该有嵌入互操作程序集的选项。

将其设置为假


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

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

https://i.stack.imgur.com/HhZPD.png


J
JaredPar

扩展乔恩的正确答案。

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


S
Sam Holder

得到了解决方案

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


这也适用于 .net 使用 PP_COM_Wrapper 的 VS2015 c#; cypress.com Cypress Semiconductor Corporation C# Lib 示例中给出。设置为 False 消除了错误。
Z
Zach

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

WshShellClass shellClass = new WshShellClass();

对此...

WshShell shellClass = new WshShell();

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


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

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

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


R
Ramezani r

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

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


R
Rahul

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