无法嵌入来自**的互操作类型解决方案

来源:互联网 发布:怎样看东芝网络电视 编辑:程序博客网 时间:2024/05/21 22:26


遇见这个问题,网上查了下解决方案挺简单的,右击属性,嵌入互操作类型改为false就行了。



问题解决了,不明白“互操作类型”是什么概念,顺道了解下:

互操作性——不同的程序借助同一套交换格式交换数据,读写相同格式文件等。无须用户了解各种功能单元的独特特性的情况下,使得功能单元之间进行通讯、执行过程或者传输数据的能力。

“嵌入互操作类型”:就是导入的意思,告诉编译器是否要把互操作类型引入,若为TRUE,即告诉编译器您将互操作类型嵌入到visual Studio中。

“互操作类型”:指一系列的com组件的程序集,是公共运行的类库文件。

了解:当 COM 互操作在最初版本的 .NET Framework 中引入时,就确立了主互操作程序集 (PIA) 的概念。引入此概念,是为了解决在组件之间共享 COM 对象的难题。for instance:如果您有一些不同的互操作程序集,分别定义了一个 Excel Worksheet,则我们无法在组件之间共享这些 Worksheet,因为它们具有不同的 .NET 类型。PIA 通过只存在一次而解决了这个难题:所有客户端都使用它,因此 .NET 类型始终是匹配的。

  尽管 PIA 在理论上是个好主意,但在实际部署中却被证明是个大麻烦,因为它只有一份,而有多个应用程序可能会尝试安装或卸载它。而由于 PIA 通常很大,事情更复杂了。Office 在默认 Office 安装方式中并未部署它们,用户只需通过使用 TLBIMP 来创建自己的互操作程序集,即可轻松绕过这一个程序集系统。

  因此,现在为了扭转这种局面,发生了两件事:

对于两个结构相同且共享相同识别特征(名称、GUID 等)的 COM 互操作类型,运行时能够聪明地将其看作同一个 .NET 类型。C# 编译器利用这一点的方式是在编译时直接在您自己的程序集中重现互操作类型,因此不再要求在运行时存在该互操作程序集。

由于篇幅所限,我不得不省略一些详细信息,但即使不了解这些信息,您也应该能够毫无障碍的使用这个功能,就像动态功能一样。您通过将引用上的“嵌入式互操作类型”属性设置为 true,告诉编译器为您将互操作类型嵌入到 Visual Studio 中。

由于 C# 团队希望这种方法成为引用 COM 程序集的首选方法,因此在默认情况下,Visual Studio 会将添加到 C# 项目中的任何新互操作引用的此属性设置为 True。如果您使用命令行编译器 (csc.exe) 来编译您的代码,请使用 /L 开关,而不是 /R 开关,来嵌入您必须引用的互操作程序集中的互操作类型。


参考文章:http://www.cnblogs.com/pnljs/archive/2012/02/20/2359313.html

原创粉丝点击