我使用下面的非託管C++代碼從Excel 2003外接實例的CLR(一個COM的.NET墊片外接):管理由CorBindToRuntimeEx加載的.NET 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中加載了錯誤版本的運行時即使有更高一個是可用的。現在我需要找出原因。
浮現在腦海中有幾個可能性:
- 有一些奇怪的與CLR實例化的特定機器上的「優先」,即使MS文檔(http://msdn.microsoft.com /en-us/library/ms231419.aspx)似乎表明你會永遠得到最新的,除非你請求一個特定的版本。
- Excel中的另一個加載項已經(故意)實例化.NET 1 CLR,並且Excel不能託管多個。
我強烈懷疑其中的第二個,但不知道如何證明/修復它。
有沒有人看過類似的行爲?關於發生什麼事的任何建議?
其他一些注意事項:
- 所有工作站運行的是Windows XP SP3
- 的Excel 2003 SP3爲Excel在我們組織的唯一版本
我不能更改的這些更新的Excel版本不是一個選項。
看起來像它可能是這個問題:http://support.microsoft.com/kb/948461所以也許有問題的機器有一箇舊版本的VSTO。我會嘗試確定這是否是問題。 – 2011-06-08 09:03:56
事實證明,機器*確實*安裝了正確的VSTO,因此不是問題所在。因此,這似乎越來越可能是Excel實例化加載項的順序,即一些以前加載的加載項請求v1 CLR。 – 2011-06-08 14:36:18