用强名称签署我的程序集会阻止它工作

时间:2010-09-15 18:45:02

标签: .net assemblies com-interop javascript strongname

我的一位同事在VB.net中创建了一个程序集,用于通过COM互操作与JScript一起使用。组件过去工作正常,但我们签了它,现在它似乎只适用于Windows 7机器。我测试了2台Windows 7计算机和2台Windows Vista计算机。

当我们签署程序集并尝试在JScript中实例化ActiveX对象时,会返回一个错误,但没有消息,只有一个数字:

  

错误:
  错误号:-2146234304

在Google上搜索错误编号并没有太多回复。

如果我们从程序集中删除强名称,它就可以正常工作。关于什么可能是问题的任何想法?不确定它是否有所作为,但正在使用VS 2010编译和签署程序集。

8 个答案:

答案 0 :(得分:6)

签署程序集后,您是否重新创建了COM Interop?如何注册新版本的程序集?你清除了Internet Explorer的缓存吗?

通常,错误-2146234304(0x80131040)表示FUSION_E_REF_DEF_MISMATCH:“找到的程序集的清单定义名称[yourAssembly]与程序集引用不匹配”。因此,您必须更新使用已签名程序集的程序集清单。在你的情况下,你应该找到它意味着什么。装配的反射也保存在Assembly HKEY_CLASSES_ROOT\CLSID\{YOUR_GUID}\InprocServer32的{​​{1}}值下,而不仅仅保存在真实的清单中。

您可以尝试调查有关Fuslogvw.exe (Assembly Binding Log Viewer)(或http://msdn.microsoft.com/en-US/library/ms229864(v=VS.80).aspx)的问题。之前可能需要HKLM\Software\Microsoft\Fusion下的注册表中的一些更改(如EnableLog,LogFailures,

如果您不能解决问题,可以发布可用于重现问题的项目链接。

答案 1 :(得分:5)

错误代码ix 0x80131040。这是一个匹配.NET异常的代码,非常常见。

  

找到的程序集的清单定义与程序集引用不匹配。

我很惊讶你没有得到它的消息,你可能想要查看你的错误处理代码。 Anyhoo,你有一些DLL Hell正在进行,CLR正在寻找一个程序集,其[AssemblyVersion]或PublicKeyToken与用于构建代码的引用程序集不匹配。鉴于这与强名称程序集相关联,您可能在构建代码后签署了程序集。在这种情况下,只需从项目中删除程序集引用并将其添加回来,现在选择强名称程序集,将解决问题。

但是无需猜测,Fuslogvw.exe实用程序会告诉您到底出了什么问题。首先运行它以获取绑定尝试的痕迹及其失败的原因。

答案 2 :(得分:1)

使用dependency walker在有问题的计算机上打开已签名的dll。它应该告诉你为什么dll无法加载。它可能依赖于Windows版本之间不同的dll,这在签名后更是一个问题。

答案 3 :(得分:0)

安迪,不确定是否this is relevant。那里的解决方案说:

我忘了更新adxloader.dll(来自\ Add-in Express中的新版本) 路径中的.NET \ Redistributables) - 我想它已经更新了......

答案 4 :(得分:0)

你的号码看起来非常像整数范围的开头!

Signed: −2,147,483,648 to +2,147,483,647, -(2^31)~(2^31-1)

也许你有一个投射错误,或者你想要增加一个非常大的数字,如果它达到最大值(+2,147,483,647),它开始从-2,147,483,648向后计数

只是一个猜测!

答案 5 :(得分:0)

您是否正在使用Microsoft Enterprise Library代码块?我已经看到这个问题弹出,人们在编译代码时没有添加对正确签名库的引用。

如果您使用的是EnterpriseLibrary,那么还有一些background

答案 6 :(得分:0)

尝试从正常运行的XP配置(或Vista框中)签署程序集。 Windows 7不支持CAPICOM,因此无论用于签署程序集的签名工具如何,都可能无法向后兼容Vista。现在我已经看到CAPICOM工作得很好,但我也看到它没有任何理由失败,“不支持”意味着如果你试图打电话,那就是你从微软支持中得到的。

答案 7 :(得分:-1)

转到.Net Framework配置控制台并使用计算机上的运行时安全策略设置。