有人可以解释一下"注册COM Interop" vs "regasm.exe xxxx.dll /tlb:xxxx.tlb"
。
根据我的理解"注册COM Interop"生成一个.tlb文件和" regasm.exe xxxx.dll /tlb:xxxx.tlb"也将生成一个.tlb文件。我们是否需要同时使用这些东西,或者任何一个都可以生成tlb文件。
答案 0 :(得分:3)
这是一种方便,旨在让您在开发和调试库时尽可能轻松地实现这一点,而无需手动运行Regasm。它与Regasm.exe / codebase / tlb完全相同。 where / codebase确保不必将程序集放在GAC中,并且/ tlb确保您拥有最新的类型库,以便在客户端或测试代码中使用。这两者在开发机器上都很重要,而不是在用户的机器上。
但是当程序员手动运行Regasm时,往往会忽略两件事。您不能忘记使用它,但是在需要重新注册时并不总是很明显。而最重要的是,它执行Regasm.exe /取消注册所做的工作,以确保旧版本的库在构建新版本之前自动取消注册。很容易被忽视,由此导致的注册表污染并不适合清理。
当您在接口,类和AssemblyInfo.cs上显式应用[Guid]属性时,由于注册表键是相同的,因此它更不重要。但是,当您需要为现有COM服务器开发替代品时,您应该只这样做。 [Guid]属性是神圣的,良好的COM实践要求每当您在库的公共接口中进行更改时它都会被更改。不这样做很可能导致DLL地狱。当[Guid]丢失时,CLR会自动处理此事。
一个缺点是,你必须运行VS提升,以便它可以写入注册表。