SXS如何选择应加载哪个框架版本?

时间:2013-09-05 16:05:14

标签: .net com manifest sxs registration-free-com

我目前正致力于使用.NET程序集(使用COM类)免费注册。 它运作良好,但我有一个问题,我似乎无法确定原因。

我的问题是,在正确的.NET Framework版本上没有进行程序集绑定。

我目前有2个组件(我们称之为A.dll和B.dll),它们都是使用.NET 4.0构建的。

B.dll非常小,我用它来测试免注册激活。它旁边有一个清单,B.dll.manifest)。它包含1个类,包含1个属性和1个方法。

A.dll要复杂得多,签名,它的清单作为构建后事件(使用mt.exe)作为资源嵌入。

我制作了一个VB6应用程序来测试它们。我的应用程序有一个manifest,它声明了依赖项。

如果我运行我的应用程序,B.dll运行良好,但A.dll不运行。使用fuslogvw.exe查看绑定日志,我发现使用.NET 2.0尝试绑定A.dll,而使用.NET 4.0完成B.dll绑定。

A.dll最终失败,错误代码为0x8013101b,即COR_E_NEWER_RUNTIME。     错误:从文件中提取清单导入时出错(hr = 0x8013101b)。

为了让它工作,我必须使用此内容将.config文件添加到我的VB6应用程序

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

然后,它绑定到正确的框架版本并且它可以工作。

我强调说,MT.exe可能会更改我的程序集中的属性/元信息,使它认为它应该加载2.0。所以我用ILSpy打开它。我在那里看到的一切都在谈论4.0,没有什么是可疑的。

我已经读过默认情况下应该使用用于构建em的FW加载程序集(在我的例子中,它们是ALL 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.

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 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.

1 个答案:

答案 0 :(得分:1)

微米。 CLR团队的米勒指出了我正确的方向。我的清单(由Windows SDK 7.0A中的mt.exe生成)未在clrClass标记的runtimeVersion中包含值。

这导致CLR Loader进入“Capped”加载路径。这个上限的加载路径来自M. Miller告诉我的,当版本不是v4或更高版本并且它将加载器的“FindLatestVersion”返回的值限制为v2时发生。因此它尝试使用2.0 FW加载程序集。

修改清单以指定正确的版本(v4.0.30319)并确保没有缓存任何内容(我必须将我的目录复制到其他地方,以便在日志中显示正确的版本),最终解决了我的问题。现在加载沿着正确的路径而不是走“封顶”路径。

所以这最终成为一个简单明显的问题。

FWIW,我尝试使用Windows SDK 8.1(最新版本)中的mt.exe生成相同的清单,并正确生成了runtimeVersion属性!

我要感谢Mark Miller对此事的帮助,如果没有他的帮助,我可能需要一段时间来解决这个问题!