首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SXS如何选择应该加载哪个框架版本?

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

Stack Overflow用户
提问于 2013-09-05 16:05:13
回答 1查看 917关注 0票数 1

我目前正致力于让.NET程序集(带有COM类)免费注册。它很好,但我有一个问题,我似乎不能确定的确切原因。

我的问题是,程序集绑定没有在正确的.NET框架版本上完成。

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

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

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 )而失败。错误:从文件中提取清单导入错误(hr = 0x8013101b)。

要使它正常工作,我必须向我的VB6应用程序添加一个包含以下内容的VB6文件

代码语言:javascript
复制
<?xml version="1.0"?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true" >
        <supportedRuntime version="v4.0" />
    </startup>
</configuration>

然后,它绑定到适当的框架版本并工作。

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

我已经读到,在默认情况下,程序集应该使用用于构建em的FW加载(在我的示例中,它们都是4.0,而不是任何地方的2.0 )。所以,我不明白为什么它会尝试使用2.0加载特定的一个。

这对我来说是个问题,因为我想避免不得不创建/维护,但最重要的是,为将要使用这个特定程序集的所有应用程序部署这些.config。在我的特殊情况下,这意味着大约有100个.config文件。

供参考:

我使用的MT.exe来自7.0ASDK,版本为5.2.3790.2076。

这是fuslogvw.exe输出(对不起法语和混乱的重音字符,最重要的部分是框架版本号)

B,工作

代码语言:javascript
复制
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,不工作

代码语言:javascript
复制
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.

正在工作(感谢配置文件)

代码语言:javascript
复制
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.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-05 21:22:18

CLR小组的米勒先生给我指明了正确的方向。我的清单(由WindowsSDK7.0A生成的mt.exe )在clrClass标记的runtimeVersion中没有包含一个值。

这导致CLR进入一个“有上限”的加载路径。根据M. Miller告诉我的,这个有上限的加载路径发生在版本不是v4或更高的时候,它将加载程序的"FindLatestVersion“返回给v2的值设置为大写。因此,它尝试使用2.0FW加载程序集。

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

因此,这最终是一个简单的明显问题。

FWIW,我尝试使用WindowsSDK8.1(最新的一个)使用mt.exe生成相同的清单,它正确地生成了runtimeVersion属性!

我要感谢马克米勒在这件事上的帮助,没有他的帮助,我需要一段时间才能解决这个问题!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18641078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档