3

我们有一个 COM 可见的 .NET exe(.NET 3.5、VS 2010 SP1、VB.NET)项目。VB6 应用程序使用 CreateObject 从该程序集创建对象。
如果我们不签署程序集,这将毫无问题。如果我们签署程序集(使用 pfx 证书),CreateObject 将失败并显示消息

无法创建对象“Our.ClassName”

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

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

4

2 回答 2

1

仔细查看注册表后发现,原因是程序集的版本号发生了变化。前段时间,注册了 3.0.0.0 版本——显然是在一个没有强名称的版本中。在构建过程中进行了一些更改后,版本被重置为 1.0.0.0。在注册表中注册了 1.0.0.0 版本,但是(当然)在我们尝试重新注册程序集时

REGASM未能删除注册表项下的 3.0.0.0 版本。解析程序集时使用最高版本,因此获得了没有强名称的程序集引用。此引用绑定到版本为 1.0.0.0 的程序集(因为它不是强名称,因此不尊重版本差异),因此它对于没有强名称的程序集正常工作。HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{00000000-0000-0000-0000-000000000000}\InprocServer32

CreateObject
我们会将版本重置为其旧值以保持一致性。

于 2014-01-08T17:02:53.887 回答
1

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

道,版本=10.0.4504.0,文化=中性,PublicKeyToken=31bf3856ad364e35

因此,在您签署后再次注册程序集是一项硬性要求。再次运行 Regasm.exe。

并且不要忘记,如果您不使用 /codebase 选项,那么您必须将程序集放入 GAC。这是首先给程序集一个强名称的通常原因。

于 2014-01-08T15:23:21.043 回答