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

New dll's are not used with precompiled code using NGen

我们有一个混合 VB6/Net 应用程序,其中使用 Com Visible Net 包装器将 Net dll 连接到 VB6 代码。依次使用带有清单的 RegFreeCom 激活此包装器。这个设置为我们工作了 2 年多。为了减少应用程序启动时间,我们在安装后使用 NGen 预编译了 Net dll。这很容易在一分钟内完成。现在我们有了一个新的 VB6 可执行文件,带有新的 dll 和新的清单,但是当我们将程序安装到现有位置时似乎没有使用新的 dll,从而替换了 dll。到不同文件夹的新安装会使用新的 dll。我检查了两个程序文件夹,两个位置都有新的 dll 和清单。新的 dll 怎么可能没有在现有程序位置被拾取并且 Windows 似乎继续使用以前版本的预生成代码?

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

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

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

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

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

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

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

  • sxstrace.exe 实用程序显示了如何解析清单。
  • fuslogvw.exe 实用程序向您展示程序集的位置。在这种情况下,将其配置为记录所有绑定,因为您不会遇到绑定失败。
  • 还有 fuslogvw.exe,您可以看到它绑定了原生图像。 Select 日志类别组框中的 "Native Images" 单选按钮。
  • SysInternals 的 Process Monitor 实用程序是诊断注册表和文件系统故障的首选武器。您将确切地看到 VB6 应用程序如何读取密钥和定位文件。