我知道Regasm工具,它用于注册.NET DLL以实现COM互操作性:http://msdn.microsoft.com/en-us/library/tzat5yw6%28v=vs.110%29.aspx。
我已离开:注册COM互操作,并根据此问题使程序集com未被显示:"Register for COM Interop" vs "Make assembly COM visible"。这样做的原因是我可以选择向COM公开哪些函数。我使用以下命令:
Regasm c:\TestApp\Test.dll /codebase /tlb
您是否必须使用codebase标志来注册DLL以实现互操作性?如果我省略了codebase标志,然后使用Visual Studio 6(VB6)中的对象资源管理器浏览到TLB,则不会出现任何类型。
我知道代码库用于在GAC中注册的DLL。是否必须用于GAC之外的人员?
答案 0 :(得分:4)
这是一个非常重要的选择,盲目地应用它并不是一个好主意。
COM有一个非常强大的DLL Hell问题。默认情况下,注册COM服务器具有计算机范围,这是由写入HKLM注册表配置单元中的注册表的服务器注册引起的。当您更改服务器的实现并且未在计算机上重新编译和升级使用该服务器的客户端程序时,会发生非常糟糕的事情。请记住,您只能直接控制服务器的版本,通常很少能够确保客户端程序也能更新。
发生好的非常糟糕的事情就是当你遵循COM合同并给coclass和接口一个不同的{guid}时。客户端程序将无法再找到正确的接口,并且在运行时因REGDB_E_CLASSNOTREG或E_NOINTERFACE运行时错误而失败。用户通常可以弄清楚出了什么问题,当然并没有让他对此感到非常高兴,但有些可能他会采取自己的纠正措施并删除你的更新。
可能发生的非常糟糕的事情是COM客户端无法定位coclass和接口,但调用失败。可能是完全错误的功能,可能是参数不再兼容。这种失败是完全不可识别的,用户无法弄清楚出了什么问题。你会得到一个"它不起作用,帮助我!"打来的电话。
.NET非常强大地支持允许不同版本的程序集在计算机上并排生存。 GAC是存储它们的地方,[AssemblyVersion]属性是关键。因此,重新编译以使用新版本的客户端程序将自动使用新版本的COM服务器。未经重新编译的程序将继续与旧版服务器一起正常运行。 GAC提供他们需要的版本。
GAC对于.NET类库也很有用,但并不是那么重要,因为大多数.NET库都部署在本地,与使用它们的EXE位于同一目录中。不是[ComVisible] .NET库的情况,因为它的注册是机器全局的。通过使用清单可以采取相应的措施,但这取决于客户端程序,而不是服务器。再次超出你的控制范围。如果客户端程序是一个广泛使用的程序,如Office应用程序或Internet Explorer,则通常非常不切实际。
所以将你的COM服务器部署到GAC是非常重要的,你真的想利用DLL地狱的反措施,并有信心更新服务器不会导致大规模问题。
您要使用/ codebase的唯一时间是在开发和测试服务器时。在这种情况下,您当然不会担心DLL Hell,您总是使用最新版本,并且不希望因将其置于GAC中而受到骚扰。容易忘记,这是你生命中的一小时,你永远不会回来。
答案 1 :(得分:3)
对于我们的混合VB6 / Net应用程序,我们使用Com visible Net dll很多,根据我们的经验,使用它的唯一方法是使用/ codebase标志注册。据我了解,这用于在GAC外部注册 。