【问题标题】:What governs the version of the .NET CLR that gets loaded by CorBindToRuntimeEx?什么控制着 CorBindToRuntimeEx 加载的 .NET CLR 的版本?
【发布时间】:2011-07-02 01:12:53
【问题描述】:

我正在使用以下非托管 C++ 代码从 Excel 2003 加载项(.NET 加载项的 COM shim)实例化 CLR:

    hr = CorBindToRuntimeEx(
        0, // version, use default
        0, // flavor, use default
        0, // domain-neutral"ness" and gc settings 
        CLSID_CorRuntimeHost, 
        IID_ICorRuntimeHost, 
        (PVOID*) &m_pHost);

对于我们组织中的绝大多数机器(几百台),即使安装了多个 CLR 版本的机器也能完美运行;但是,对于一些机器,会实例化错误(旧)版本的 CLR,然后无法加载程序集,因为它需要 .NET 2 运行时。

昨天我第一次运行 Process Explorer,在其中一台有问题的机器上显示以下内容非常有启发性:

process     pid   type   Handle or DLL
-------     ---   ----   -------------
procexp.exe 5056  DLL    c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorworks.dll
EXCEL.EXE   7180  DLL    c:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\mscorworks.dll

即Excel 已加载错误版本的运行时,即使有较新的版本可用。现在我需要找出原因。

想到的几种可能性:

  1. 尽管 MS 文档 (http://msdn.microsoft.com/en-us/library/ms231419.aspx) 似乎表明特定机器上的 CLR 实例化的“优先级”有些奇怪除非您请求特定版本,否则您将始终获得最新版本。
  2. Excel 中的另一个加载项已经(故意)实例化了一个 .NET 1 CLR,并且 Excel 不能承载多个。

我强烈怀疑其中的第二个,但不知道如何证明/修复它。

有没有人见过类似的行为?有什么建议吗?

其他几点说明:

  • 所有工作站都运行 Windows XP SP3
  • Excel 2003 SP3 是我们组织中唯一的 Excel 版本

我无法更改其中任何一个,因此不能选择更新的 Excel 版本。

【问题讨论】:

  • 看起来可能是这个问题:support.microsoft.com/kb/948461 所以可能有问题的机器有旧版本的 VSTO。我会尝试确定这是否是问题所在。
  • 机器确实安装了正确的VSTO,所以这不是问题。因此,这似乎越来越可能取决于 Excel 实例化加载项的顺序,即一些先前加载的加载项请求 v1 CLR。​​

标签: .net clr


【解决方案1】:

这是臭名昭著的 CLR 版本注入问题。这是一种温和的类型,而不是您在 .NET 中编写 shell 扩展时遇到的真正讨厌的类型。

问题是在您的加载项之前加载了一个加载项,它要求加载 1.1 版本的 CLR。这就是责任停止的地方,一个进程只能有一个版本的 CLR。您可以要求在 CorBindToRuntimeEx() 调用中加载 2.0.50727 版本,这是您的加载项所需的版本。但这会失败。请求默认版本会成功,但现在您的加载项将无法加载。

“温和”的角度是,您可以在技术上更改加载项的加载顺序,确保首先加载 CLR 2.0。实际上不确定如何执行此操作。需要 1.1 的插件有合理的几率仍然可以正常工作。在 superuser.com 上询问您是否想要这样做。

有一个长期解决方案,CLR 版本 4 支持 CLR 的进程内并行版本控制。暂时不能帮到你。

【讨论】:

    【解决方案2】:

    您可以使用GetCORVersion 来检查CLR 是否已经加载?如果 GetCORVersion 返回 v1.x 作为加载的 CLR 版本,则中止加载 CLR 并向用户显示错误消息。

    是否可以选择将加载项迁移到 .net v4? v4 支持 CLR 的进程内并行托管((v1.x OR V2) AND V4 和更新版本)。看CLRCreateInstance

    参考资料:
    CLR Hosting Overview
    In-Process Side-by-Side @ MSDN Magazine

    【讨论】:

      猜你喜欢
      • 2015-03-17
      • 2012-02-15
      • 2017-02-20
      • 2018-03-26
      • 2014-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多