SXS 如何选择应加载的框架版本



我目前正在努力让.NET程序集(带有COM类)免费注册。它运行良好,但是我有一个问题,我似乎无法确定确切的原因。

我的问题是,程序集绑定不是在正确的.NET Framework版本上完成的。

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

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

A.dll 要复杂得多,经过签名,它的 manifest 作为资源嵌入为构建后事件(使用 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)。

要使其正常工作,我必须使用此内容向我的 VB6 应用程序添加一个 .config 文件

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

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

我猜也许MT.exe改变了我的程序集中的属性/元信息,使其认为它应该加载2.0。所以我用ILSpy打开了它。我在那里看到的一切都在谈论 4.0,没有什么可疑的。

我已经读到默认情况下,应该使用用于构建 em 的固件加载程序集(就我而言,它们都是 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:RegFreeComBafComClientbinTBProject1.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:WindowsMicrosoft.NETFrameworkv4.0.30319configmachine.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:RegFreeComBafComClientbinTBB.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:RegFreeComBafComClientbinTBB.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:RegFreeComBafComClientbinTBProject1.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:WindowsMicrosoft.NETFrameworkv2.0.50727configmachine.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:RegFreeComBafComClientbinTBA.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:RegFreeComBafComClientbinTBProject1.exe.Config).
JRN : utilisation du fichier de configuration de l'application : C:RegFreeComBafComClientbinTBProject1.exe.Config
JRN : utilisation du fichier de configuration d'hôte : 
JRN : utilisation du fichier de configuration de l'ordinateur à partir de C:WindowsMicrosoft.NETFrameworkv4.0.30319configmachine.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:RegFreeComBafComClientbinTBA.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:RegFreeComBafComClientbinTBA.dll.
JRN : l'assembly est chargé dans le contexte de chargement default.

CLR团队的M. Miller为我指出了正确的方向。我的清单(由 Windows SDK 7.0A 中的 mt.exe 生成)在运行时版本中不包含 clrClass 标记的值。

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

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

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

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

我要感谢马克米勒在这件事上的帮助,没有他的帮助,我需要一段时间才能弄清楚!

相关内容

  • 没有找到相关文章

最新更新