一旦签名,CreateObject就会因COMVisible程序集而失败

时间:2014-01-08 14:45:02

标签: .net vb.net com-interop strongname createobject

我们有一个COM可见的.NET exe(.NET 3.5,VS 2010 SP1,VB.NET)项目。 VB6应用程序使用CreateObject从此程序集创建对象 如果我们不签署程序集,这没有任何问题。如果我们对程序集进行签名(使用pfx-certificate),则CreateObject将失败并显示消息

  

无法创建对象“Our.ClassName”

不幸的是,事件日志中没有条目。可以毫无问题地启动.NET exe,因此所有依赖项都应该就绪。我们还启用了.NET绑定日志记录,但是在调用CreateObject时它不会写任何内容(因此我们怀疑在加载程序集之前创建失败)。
我们已经跟踪了所有变化,唯一重要的区别是装配是否签名。我们也尝试过不同的证书,但行为不会改变。

有没有人以前经历过这种行为并且可以提供解决方案?有什么方法可以为我们提供有关失败的更多信息吗?

2 个答案:

答案 0 :(得分:1)

强烈命名程序集会更改其PublicKeyToken。这是程序集的完全限定名称的一部分,它在注册程序集时记录在注册表中。例如,运行Regedit.exe并导航到HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{00000100-0000-0010-8000-00AA006D2EA4}\InprocServer32,汇编值。你会看到:

  

dao,Version = 10.0.4504.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35

因此,签署后再次注册程序集是一项艰难的要求。再次运行Regasm.exe。

不要忘记,如果不使用/ codebase选项,则必须将程序集放在GAC中。通常,首先要给大会一个强有力的名字。

答案 1 :(得分:1)

另一个仔细研究注册表显示,原因是程序集版本号的变化。前段时间,版本3.0.0.0已注册 - 显然是在没有强名称的版本中。在构建过程中进行一些更改后,版本重置为1.0.0.0。

注册表中REGASM注册版本1.0.0.0,但当我们尝试重新注册程序集时,(当然)无法在注册表中的密钥HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{00000000-0000-0000-0000-000000000000}\InprocServer32下删除3.0.0.0版本。

CreateObject在解析程序集时使用最高版本,因此在没有强名称的情况下获取程序集引用。此引用绑定到版本为1.0.0.0的程序集(因为它没有强名称,版本的差异未得到遵守),因此它对于没有强名称的程序集正常工作。
我们会将版本重置为旧值,以保持一致性。