如何生成Interop.xxxxx.dll?

时间:2014-03-07 23:20:52

标签: c# c++ visual-studio dll com

我最近接手了一个项目并且很少有VS COM经验,所以如果我没有问正确的问题,请原谅我。

我有一个生成COM dll的C ++项目,我们将其命名为abc.dll。

我有另一个引用COM dll的C#项目,但是在引用下,它指向Interop.abc.dll。我删除了目录中的所有abc.dll和interrop.abc.dll以查看项目将如何反应,在启动项目时,会自动生成interop.abc.dll。这令人难以置信,因为我不知道如何生成interop.abc.dll。

所以这是我的问题: 1.如果生成这个,C#项目最初如何引用interop.abc.dll? 2.如果没有abc.dll开始,如何生成interop.abc.dll(我已经构建了它) 3.我玩弄了项目,然后interop.abc.dll停止生成并导致错误,为什么会这样?

感谢任何帮助

1 个答案:

答案 0 :(得分:7)

COM声明存储在类型库中。其中非常类似于.NET元数据,COM是.NET的祖父,元数据告诉编译器哪些类型存储在程序集中。然而,类型库使用相当笨拙的二进制格式,它与.NET元数据非常不同。不同,足以使从类型库到.NET元数据的转换变得非常重要。有些构造根本没有转换,有些构造很麻烦,你应该知道它。

因此,.NET团队决定转换应该是一个单独的步骤,当类型库内容与.NET元数据不够匹配时,可能会显示警告或错误。该转换工具是Tlbimp.exe,即类型库导入工具。他们 将此功能添加到Project + Add Reference对话框。只要转换没有产生任何警告,这可以正常工作。它经常发生。

因此,Tlbimp.exe和Add Reference中的IDE的工作是将类型库内容机械转换为.NET元数据内容。按照惯例,名为“Foo”的类型库将转换为“Interop.Foo.dll”。它不一定是默认名称。您将最终得到一个不包含任何代码的.NET程序集,只包含元数据。任何.NET编译器可以直接使用的.NET类型,以及与类型库声明匹配的.NET类型。 [ComImport]属性是一个非常重要的属性,告诉CLR元数据实际上是用于COM类型。

所以这一切都解释了子弹1.子弹2是不行的,你真的需要类型库。它经常作为资源嵌入到非托管DLL中,Tlbimp.exe知道如何找到它。没有人能看到3中的错误,所以当然问题可能是不可能的。请记住,转换并不总是没有问题,转换步骤是明确的。