类不能嵌入。改用适用的接口

Posted

技术标签:

【中文标题】类不能嵌入。改用适用的接口【英文标题】:Class cannot be embedded. Use the applicable interface instead 【发布时间】:2011-05-12 07:13:13 【问题描述】:

我正在使用 WIA 将图像从扫描仪捕获到 Windows 窗体。这是我正在使用的代码:

private void button2_Click(object sender, EventArgs e)

    const string wiaFormatJPEG = "B96B3CAE-0728-11D3-9D7B-0000F81EF32E";
    CommonDialogClass wiaDiag = new CommonDialogClass();
    WIA.ImageFile wiaImage = null;

    wiaImage = wiaDiag.ShowAcquireImage(
            WiaDeviceType.UnspecifiedDeviceType,
            WiaImageIntent.GrayscaleIntent,
            WiaImageBias.MaximizeQuality,
            wiaFormatJPEG, true, true, false);

    WIA.Vector vector = wiaImage.FileData;

    Image i = Image.FromStream(new MemoryStream((byte[])vector.get_BinaryData()));
    i.Save(@"D:\prueba1.jpeg");

在尝试运行这个小测试时,我收到了这个错误:

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

还有这个:

'WIA.CommonDialogClass' 没有 包含一个定义 'ShowAcquireImage' 并且没有扩展名 方法“ShowAcquireImage”接受 类型的第一个参数 可以找到“WIA.CommonDialogClass” (您是否缺少 using 指令或 程序集参考?

我猜第二个错误是因为第一个错误而上升的,对吧?

关于如何解决此问题的任何建议?

【问题讨论】:

我发现 CommonDialogClass 在 .NET 3.5 中工作,而您遇到的问题是在以后的版本中引入的。 【参考方案1】:

第二个错误是由第一个错误引起的。嵌入互操作类型功能仅支持嵌入接口,不支持类。除了将 WIA 引用上的该选项设置为 False 并部署互操作库之外,您还可以像这样修复它:

 WIA.CommonDialog wiaDiag = new WIA.CommonDialog();

不直观,但允许使用 new 运算符创建 COM 接口。您需要在命名空间名称前加上前缀,因为 CommonDialog 与 Winforms CommonDialog 类有歧义。

【讨论】:

虚幻!它几乎像dynamic 类一样工作,因为您不会为任何操作获得智能感知,但它实际上按预期执行。谢谢朋友!【参考方案2】:

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

出现此错误是因为新项目中引用的 TestStand API Interop 程序集的 Embed Interop Types 属性的默认值为 true。要解决此错误,请按照以下步骤将 Embed Interop Types 属性的值更改为 False:

Select the TestStand Interop Assembly reference in the references section of your project in the Solution Explorer.
Find the Embed Interop Types property in the Property Browser, and change the value to False

相关链接: 知识库 595FQJPI:我可以将 Visual Studio 2010 与 TestStand 一起使用并调用 .NET Framework 4.0 代码模块吗?

【讨论】:

【参考方案3】:

简单地说,您只需在解决方案面板/参考中选择错误程序集。然后,按 Alt-Enter (Properties),找到“Embed Interop Type”并将其值设置为“False”,如果它为 True 兄弟!

【讨论】:

以上是关于类不能嵌入。改用适用的接口的主要内容,如果未能解决你的问题,请参考以下文章

VS2010中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法

无法嵌入互操作类型“ApplicationClass”。请改用适用的接口 - Microsoft.Office.Interop.Word.ApplicationClass

无法嵌入互操作类型“dsdll.hisdllClass

VS2010中出现无法嵌入互操作类型

嵌入式C语言设计模式 --- 抽象工厂模式

嵌入式C语言设计模式 --- 抽象工厂模式