2013-09-05 60 views
1

我目前正在努力使.NET程序集(使用COM類)免費註冊。 它運作良好,但我有一個問題,我似乎無法指出確切的原因。SXS如何選擇應該加載哪個框架版本?

我的問題是,程序集綁定沒有在正確的.NET Framework版本上完成。

我現在有2個組裝(我們姑且稱之爲A.DLL和B.DLL),他們使用的是.NET 4.0兩建。

B.dll非常小,我做了它來測試無註冊激活。它旁邊有一個清單,B.dll.manifest)。它包含1個類,1個屬性和1個方法。

A.DLL要複雜得多,簽署,它的表現是內嵌的資源作爲生成後事件(使用mt.exe)。

我做了一個VB6應用程序來測試它們。我的應用程序有一個清單,它聲明瞭依賴關係。

如果我運行我的應用程序,B.dll工作正常,但A.dll不。用fuslogvw.exe查看綁定日誌,發現A.dll的綁定嘗試使用.NET 2.0,而B.dll使用.NET 4.0完成。

A.DLL結束,錯誤代碼0x8013101b,這是COR_E_NEWER_RUNTIME失敗。 ERR:從文件中提取清單導入時出錯(hr = 0x8013101b)。

爲了得到它的工作,我有一個config文件添加到我的VB6應用程序與此內容

<?xml version="1.0"?> 
<configuration> 
    <startup useLegacyV2RuntimeActivationPolicy="true" > 
     <supportedRuntime version="v4.0" /> 
    </startup> 
</configuration> 

然後,結合適當的框架版本和它的作品。

我tougth,也許,MT.exe改變屬性/元信息在我的裝配,使得它認爲它應該是裝載了2.0。所以我打開它使用ILSpy。我在那裏看到的所有內容都會談到4.0,而且沒有什麼是可疑的。

我讀過,大會應加載,默認情況下,使用用於建立EM的FW(對我來說,他們都是4.0,沒有任何地方2.0)。所以,我不明白它試圖使用2.0加載特定的一個。

這是我的問題,我想避免創建/維護,但最重要的是部署這些的.config所有那些打算用這種特殊的組件的應用程序。這意味着在我的特殊情況下會有大約100個.config文件。

參考:

的MT.exe我使用是從7.0A SDK和是5.2.3790.2076版本。

這裏是fuslogvw。exe文件輸出(抱歉法國和弄亂突出炭,重要的部分是框架版本號反正)

B,工作

JRN : cette liaison démarre dans le contexte de chargement de default. 
JRN : tentative de téléchargement du fichier de configuration de l'application à partir de file:///C:/RegFreeCom/BafComClient/binTB/Project1.exe.config. 
JRNÂ : Le fichier de configuration C:\RegFreeCom\BafComClient\binTB\Project1.exe.config n'existe pas. 
JRN : aucun fichier de configuration de l'application n'a été trouvé. 
JRN : utilisation du fichier de configuration d'hôte : 
JRN : utilisation du fichier de configuration de l'ordinateur à partir de C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config. 
JRN : stratégie non appliquée à la référence à ce stade (liaison d'assembly privée, personnalisée, partielle ou basée sur l'emplacement). 
JRN : tentative de téléchargement de la nouvelle URL file:///C:/RegFreeCom/BafComClient/binTB/sidebysidenet.DLL. 
JRN : le téléchargement de l'assembly a réussi. Tentative d'installation du fichier : C:\RegFreeCom\BafComClient\binTB\B.dll 
JRN : entrée dans la phase d'installation à exécution à partir de la source. 
JRN : le nom de l'assembly est : B, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 
JRN : la liaison a réussi. Elle retourne un assembly à partir de C:\RegFreeCom\BafComClient\binTB\B.dll. 
JRN : l'assembly est chargé dans le contexte de chargement default. 

A,不工作

JRN : cette liaison démarre dans le contexte de chargement de default. 
JRN : tentative de téléchargement du fichier de configuration de l'application à partir de file:///C:/RegFreeCom/BafComClient/binTB/Project1.exe.config. 
JRNÂ : Le fichier de configuration C:\RegFreeCom\BafComClient\binTB\Project1.exe.config n'existe pas. 
JRN : aucun fichier de configuration de l'application n'a été trouvé. 
JRN : utilisation du fichier de configuration de l'ordinateur à partir de C:\Windows\Microsoft.NET\Framework\v2.0.50727\config\machine.config. 
JRN : référence post-stratégie : A, Version=1.0.0.0, Culture=neutral, PublicKeyToken=SomeToken, processorArchitecture=MSIL 
JRN : échec de la recherche dans le GAC. 
JRN : tentative de téléchargement de la nouvelle URL file:///C:/RegFreeCom/BafComClient/binTB/A.DLL. 
JRN : le téléchargement de l'assembly a réussi. Tentative d'installation du fichier : C:\RegFreeCom\BafComClient\binTB\A.dll 
JRN : entrée dans la phase d'installation à exécution à partir de la source. 
ERR : erreur lors de l'extraction de l'importation du manifeste à partir du fichier (hr = 0x8013101b). 
ERR : impossible de terminer l'installation de l'assembly (hr = 0x8013101b). Détection terminée. 

甲,工作(由於配置文件)

JRN : cette liaison démarre dans le contexte de chargement de default. 
JRN : tentative de téléchargement du fichier de configuration de l'application à partir de file:///C:/RegFreeCom/BafComClient/binTB/Project1.exe.Config. 
JRN : le fichier de configuration de l'application a été trouvé (C:\RegFreeCom\BafComClient\binTB\Project1.exe.Config). 
JRN : utilisation du fichier de configuration de l'application : C:\RegFreeCom\BafComClient\binTB\Project1.exe.Config 
JRN : utilisation du fichier de configuration d'hôte : 
JRN : utilisation du fichier de configuration de l'ordinateur à partir de C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config. 
JRN : référence post-stratégie : A, Version=1.0.0.0, Culture=neutral, PublicKeyToken=SomeToken, processorArchitecture=MSIL 
JRN : échec de la recherche dans le GAC. 
JRN : tentative de téléchargement de la nouvelle URL file:///C:/RegFreeCom/BafComClient/binTB/A.DLL. 
JRN : le téléchargement de l'assembly a réussi. Tentative d'installation du fichier : C:\RegFreeCom\BafComClient\binTB\A.dll 
JRN : entrée dans la phase d'installation à exécution à partir de la source. 
JRN : le nom de l'assembly est : A, Version=1.0.0.0, Culture=neutral, PublicKeyToken=SomeToken 
JRN : la liaison a réussi. Elle retourne un assembly à partir de C:\RegFreeCom\BafComClient\binTB\A.dll. 
JRN : l'assembly est chargé dans le contexte de chargement default. 
+0

認爲它可能是因爲mt.exe,我修改了我的構建後事件以僅生成清單並跳過嵌入(不改變我的程序集)。我仍然得到同樣的錯誤。嘗試移植到MT的新版本(SDK 8.1附帶的版本),並沒有解決它。 –

+0

發現我在程序集中引用了舊的2.0程序集。我刪除它們來測試它。同樣的結果,所以參考不是什麼導致我的問題。 –

回答

1

M.從CLR隊米勒指出我正確的方向。我的清單(由Windows SDK 7.0A中的mt.exe生成)未在clrClass標記的runtimeVersion中包含值。

這導致CLR加載程序進入「加載」加載路徑。根據M.Miller告訴我的,這個上限加載路徑發生在版本不是v4或更高版本時,並且它將裝載器的「FindLatestVersion」返回的值限制爲v2。所以它會嘗試使用2.0 FW加載程序集。

修改清單以指定正確的版本(v4.0.30319)並確保沒有任何內容被緩存(我必須將我的目錄複製到其他地方,以便正確的版本出現在日誌中),最終解決了我的問題。現在,加載沿着正確的路徑而不是「封閉」路徑。

所以這最終成爲一個簡單的清單問題。

FWIW,我試着使用Windows SDK 8.1(最新版本)中的mt.exe生成相同的清單,並且它正確地生成了runtimeVersion屬性!

我要感謝馬克米勒在這件事上的幫助,沒有他的幫助,我花了一段時間才弄清楚這一點!

+0

關於緩存機制,我找到了這個博客條目。緩存使調試錯誤清單非常困難。此博客條目包含解決方法 http://csi-windows.com/blog/all/27-csi-news-general/245-find-out-why-your-external-manifest-is-being-ignored –

+1

Glad我能夠幫助。這裏的關鍵部分是使用免註冊的COM來註冊CLSID,並且清單中沒有包含墊片用於確定哪個運行時適用的版本字符串。通常使用RegAsm或其他工具進行註冊會生成具有適當版本字符串的註冊表項,顯然,mt.exe(至少最新版本)也可以正確使用。請注意,這是「運行時版本」,類似於用於supportedRuntime配置元素的版本字符串,而不是用於.NET(3.5,4.5等)的「市場版本」 –

+0

是的,最新版本(SDK 8.1) mt.exe的確包含正確的runtimeVersion。但是,安裝在「7.0A」下的那個沒有。對任何試圖使用它來生成無Reg-COM COM清單的人來說,都只是一個警告。 –

相關問題