C# Interop.xxxxx.dll是如何生成的?

C# Interop.xxxxx.dll是如何生成的?,c#,c++,visual-studio,dll,com,C#,C++,Visual Studio,Dll,Com,我最近接手了一个项目,没有什么VS COM经验,所以如果我问的问题不对,请原谅我 < >我有一个C++项目,它生成一个COMDLL,让我们命名它为ABC.DLL。 我有另一个C#项目,它引用了COM dll,但是在引用下,它指向Interop.abc.dll。我删除了目录和interrop.abc.dll中的所有abc.dll,以查看项目将如何反应,在启动项目时,interop.abc.dll将自动生成。这让我很困惑,因为我不知道interop.abc.dll是如何生成的 下面是我的问题: 如果

我最近接手了一个项目,没有什么VS COM经验,所以如果我问的问题不对,请原谅我

< >我有一个C++项目,它生成一个COMDLL,让我们命名它为ABC.DLL。 我有另一个C#项目,它引用了COM dll,但是在引用下,它指向Interop.abc.dll。我删除了目录和interrop.abc.dll中的所有abc.dll,以查看项目将如何反应,在启动项目时,interop.abc.dll将自动生成。这让我很困惑,因为我不知道interop.abc.dll是如何生成的

下面是我的问题:

  • 如果生成interop.abc.dll,C#项目最初是如何引用interop.abc.dll的

  • 如果一开始没有abc.dll(我还没有构建它),interop.abc.dll是如何生成的

  • 我处理了这个项目,然后interop.abc.dll停止生成并导致错误,为什么


  • COM声明存储在类型库中。与.NET元数据非常相似,COM是.NET的祖父,元数据告诉编译器程序集中存储了哪些类型。然而,类型库使用的是一种相当笨拙的二进制格式,它与.NET元数据非常不同。差异足以使从类型库到.NET元数据的转换变得非常简单。有些构造根本没有转换,有些构造非常麻烦,您应该了解它

    因此.NET团队决定转换应该是一个单独的步骤,当类型库内容与.NET元数据不匹配时,转换可能会显示警告或错误。转换工具是类型库导入工具。他们确实在“项目+添加引用”对话框中添加了此功能。只要转换没有生成任何警告,这就可以正常工作。通常是这样

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


    这就解释了子弹1。Bullet 2是不可能的,您确实需要类型库。它通常作为资源嵌入到非托管DLL中,Tlbimp.exe知道如何找到它。没有人能看到3中的错误,所以问题可能是什么当然是不必要的。请记住,转换并不总是没有问题的,这就是明确转换步骤的意义。

    谢谢您的回答!您是说为了生成interop.xx.dll,tlb必须在之前存在吗?但是,谁生成tlb呢?如果有机会,我得再检查一遍。再次感谢你!创建COM组件(通常使用midl.EXE)的程序员如何引用.dll?通过添加引用->COM?请指教,谢谢!我更喜欢直接引用互操作,并将其检查到源代码管理中,这样您就不必在生成机器上注册dll,就可以根据源代码管理构建项目。这使得其他开发人员更容易构建代码。所涉及的步骤更少。这是否意味着为了生成互操作,必须在构建时注册dll(目前我将其设置为“无注册”,这是导致问题的原因吗?)