【发布时间】: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 已加载错误版本的运行时,即使有较新的版本可用。现在我需要找出原因。
想到的几种可能性:
- 尽管 MS 文档 (http://msdn.microsoft.com/en-us/library/ms231419.aspx) 似乎表明特定机器上的 CLR 实例化的“优先级”有些奇怪除非您请求特定版本,否则您将始终获得最新版本。
- Excel 中的另一个加载项已经(故意)实例化了一个 .NET 1 CLR,并且 Excel 不能承载多个。
我强烈怀疑其中的第二个,但不知道如何证明/修复它。
有没有人见过类似的行为?有什么建议吗?
其他几点说明:
- 所有工作站都运行 Windows XP SP3
- Excel 2003 SP3 是我们组织中唯一的 Excel 版本
我无法更改其中任何一个,因此不能选择更新的 Excel 版本。
【问题讨论】:
-
看起来可能是这个问题:support.microsoft.com/kb/948461 所以可能有问题的机器有旧版本的 VSTO。我会尝试确定这是否是问题所在。
-
机器确实安装了正确的VSTO,所以这不是问题。因此,这似乎越来越可能取决于 Excel 实例化加载项的顺序,即一些先前加载的加载项请求 v1 CLR。