为啥 C# 需要注册 COM DLL 才能引用它?

Posted

技术标签:

【中文标题】为啥 C# 需要注册 COM DLL 才能引用它?【英文标题】:Why does C# needs to register COM DLL in order to reference it?为什么 C# 需要注册 COM DLL 才能引用它? 【发布时间】:2014-09-04 18:46:41 【问题描述】:

要在 C++ 中使用 COM .dll,我在编译时需要的只是 #import TLB(或提取 TLB 的 DLL),我准备好了。为什么C#需要注册DLL(无注册COM同注册)才能编译?为什么 TLB 不够用?

注意我的问题是关于使用 COM 对象编译.dll。我明白为什么必须在运行时注册对象。

【问题讨论】:

我不确定任何旧的 C++ 应用程序是否可以在没有注册的情况下运行 COM .dll;这似乎是 COM 本身的对立面。也许该应用程序直接使用该 DLL 提供的功能,而无需通过 COM 服务器中介。 @antiduh 注意我只询问编译,而不是运行。 从.NET,可以引用TLB,为什么说要注册呢? 【参考方案1】:

首先,与 C++ 编译器或许多其他可以读取类型库的编译器不同,CLR 和 .NET 编译器实际上都不能读取类型库。它们都依赖于 interop 库,这是一个从类型库生成的 .NET 程序集。它只包含从 tlb 反编译的声明,采用 CLR 和编译器都可以理解的格式。

执行此操作的主要工具是 Tlbimp.exe,即类型库导入器。

运行 Tlbimp.exe 不是硬性要求,尽管您会考虑在构建服务器上执行此操作。 IDE 还支持从“添加引用”对话框浏览已注册的类型库。添加到项目中的项包含注册表项,而不是类型库名称。 <ResolveComReference> MSBuild 任务从注册表信息生成互操作程序集。

这样做的主要优点是现在很容易自动生成清单条目,因此无需注册即可使用 COM 服务器。又名“无注册 COM”。需要注册表信息才能提供清单条目。只需将独立属性设置为 True 以供参考即可打开。 非常可取。

【讨论】:

首先,非常感谢您的详细回答,但如果我理解正确,应该可以在注册了 COM DLL 的机器上生成互操作程序集,然后在构建服务器上生成我应该只能引用互操作并且一切都应该工作,我做对了吗? 我试过了,编译失败了,我想知道它是不是因为我遗漏了其他东西而失败了,或者我把整个事情弄错了...... 您问了一个 XY 问题。我回答 Y,我不知道 X 长什么样。提出另一个问题并解释您的问题,并做好记录。

以上是关于为啥 C# 需要注册 COM DLL 才能引用它?的主要内容,如果未能解决你的问题,请参考以下文章

我是不是需要注册 COM dll 才能在 .NET 项目中引用它?

c#读取word文档为何要引用com

C#实现Dll(OCX)控件自动注册的两种方法 网上找的 然后 自己试了试 还是可以用的

怎么在C#中添加用C语言开发的动态链接库dll文件(vs2010)?

C++/CLI 为啥对托管不可见

在 C# 中使用 COM ActiveX DLL 而不引用它