如何生成Interop.xxxxx.dll?

use*_*960 5 c# c++ com dll visual-studio

我最近接手了一个项目并且很少有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停止生成并导致错误,为什么是吗?

任何帮助表示赞赏

Han*_*ant 7

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

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

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

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

  • 我更喜欢直接引用互操作并将其检查到源代码管理中,这样您就不必在构建计算机上注册 dll 来构建源代码控制之外的项目。这使得其他开发人员可以更轻松地构建代码。涉及的步骤更少。 (2认同)