新的dll不与使用NGen的预编译代码一起使用

时间:2015-02-19 08:19:03

标签: .net ngen

我们有一个混合的VB6 / Net应用程序,其中Net dll使用Com Visible Net包装器连接到VB6代码。使用带有清单的RegFreeCom激活此包装器。此设置适用于我们超过2年。为了减少应用程序启动时间,我们在安装后使用NGen预编译Net dll。这需要一分钟才能完成。现在我们有一个新的VB6可执行文件,带有新的dll和新的清单,但是当我们将程序安装到现有位置时,似乎没有使用新的dll,从而替换了dll。对不同文件夹的新安装确实使用了新的dll。我检查了两个程序文件夹,两个位置都有新的dll和manifestss。如何才能在现有程序位置拾取新的dll并且Windows似乎继续使用先前版本的预生成代码?

我注意到NGenning在几秒钟内完成了声明编译后的图像是最新的,这显然不是。更改dll的版本号是不是足以触发创建新图像?目前我们没有对dll进行数字签名。

2 个答案:

答案 0 :(得分:1)

在调用NGen处理程序集后,.NET Framework会在本机映像缓存中保留一个缓存版本,程序会在默认情况下尝试加载,而不是程序集。因此,用新的组件替换旧组件不会影响您的程序。

通过调用NGen卸载缓存版本,程序可以看到您的新程序集,一切都开始工作。

可以在互联网上找到更多技术细节,例如

https://blogs.msdn.microsoft.com/clrcodegeneration/2010/04/27/ngen-getting-started-with-ngen-in-visual-studio/

答案 1 :(得分:1)

你可能犯的错误太多,你的问题无助于缩小范围。您可能忘记更新VB6项目中的类型库引用,类型库仅支持major.minor版本号,GAC中可能存在副本,可能存在杂散的注册表项,您的清单可能根本不会使用,它可能是一个简单的部署oops,你可能增加了错误的程序集属性(如AssemblyFileVersion)。等等。

您需要使用诊断工具来查看实际情况,以便缩小可能的原因:

  • sxstrace.exe实用程序显示了如何解析清单。
  • fuslogvw.exe实用程序显示程序集的位置。在此情况下将其配置为记录所有绑定,因为您没有遇到绑定失败。
  • 同样使用fuslogvw.exe,您可以看到它绑定本机图像。在“日志类别”组框中选择“本机映像”单选按钮。
  • SysInternals'Process Monitor实用程序是诊断注册表和文件系统故障的首选武器。您将看到VB6应用程序读取密钥和查找文件的具体方式。