c# - 使用 "Register for COM Interop"与 "regasm.exe xxxx.dll/tlb:xxxx.tlb"的区别?

标签 c# com-interop

谁能解释一下“Register for COM Interop”与 “regasm.exe xxxx.dll/tlb:xxxx.tlb” 之间的区别。

根据我的理解,“Register for COM Interop”会生成一个 .tlb 文件,“regasm.exe xxxx.dll/tlb:xxxx.tlb”也会生成一个 .tlb 文件。我们需要同时使用这两种东西还是任何一种都可以生成 tlb 文件。

最佳答案

这是一种便利,旨在使开发和调试库时尽可能轻松地做到这一点,而无需手动运行 Regasm。它做的事情与 Regasm.exe/codebase/tlb 做的完全一样。/codebase 确保不必将程序集放在 GAC 中,/tlb 确保您拥有最新的类型库以用于客户端或测试代码。两者在开发机器上都很重要,而不是在用户机器上。

但是有两件事是程序员在手动运行 Regasm 时经常忽略的。您不能忘记使用它,何时需要重新注册并不总是很明显。最重要的是,它执行 Regasm.exe/unregister 所做的事情,以确保在构建新版本之前自动注销旧版本的库。很容易被忽视,由此造成的注册表污染事后清理起来并不好。

当您在接口(interface)、类和 AssemblyInfo.cs 上显式应用 [Guid] 属性时,它的重要性就会降低很多,因为注册表项是相同的。但是,只有在需要开发现有 COM 服务器的直接替代品时才应该这样做。 [Guid] 属性是神圣的,良好的 COM 实践要求在您对库的公共(public)接口(interface)进行更改时更改它。不这样做很可能导致 DLL Hell。当缺少 [Guid] 时,CLR 会自动处理此问题。

一个缺点是,您必须运行提升的 VS,以便它可以写入注册表。

关于c# - 使用 "Register for COM Interop"与 "regasm.exe xxxx.dll/tlb:xxxx.tlb"的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46076436/

相关文章:

c# - 我如何在 C# 中有条件地并行运行多个方法

.net - VB6 COM+ 调用 .Net COM DLL

java - 使用 Java (DCOM) 远程访问 COM 服务器 (EXE)

c# - 如何在 C# 中创建对象?

c# - 无法在 C# 中实例化 COM 组件 - 错误 80070002

c# - 我们如何检测 COM Interop 应用程序中的内存泄漏?

c# - 将 @ 放在 Html.Raw 之前如何工作?

c# - 每个循环的 C# 以什么顺序迭代 List<T>?

c# - 我可以通过附近的多边形查询带有边界多边形的 DocumentDB 文档吗?

c# - System.IO.Ports.SerialPort 和多线程