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

.net SXS如何选择应该加载哪个框架版本?,.net,com,manifest,sxs,registration-free-com,.net,Com,Manifest,Sxs,Registration Free Com,我目前正在努力使.NET程序集(带有COM类)免费注册。 它工作得很好,但我有一个问题,我似乎无法确定确切的原因 我的问题是,程序集绑定没有在正确的.NET Framework版本上完成 我目前有两个汇编程序(我们称它们为A.dll和B.dll),它们都是使用.NET4.0构建的 dll非常小,我做它来测试注册自由激活。它旁边有一个清单(B.dll.manifest)。它包含1个具有1个属性和1个方法的类 dll要复杂得多,需要签名,它的清单作为资源嵌入到生成后事件中(使用mt.exe) 我制作

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

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

我目前有两个汇编程序(我们称它们为A.dll和B.dll),它们都是使用.NET4.0构建的

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

dll要复杂得多,需要签名,它的清单作为资源嵌入到生成后事件中(使用mt.exe)

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

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

dll最终失败,错误代码为0x801310B,这是COR_E_更新的运行时。 错误:从文件中提取清单导入时出错(hr=0x801310b)

为了让它正常工作,我必须向我的VB6应用程序中添加一个包含此内容的.config文件

<?xml version="1.0"?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true" >
        <supportedRuntime version="v4.0" />
    </startup>
</configuration>
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、 正在工作(由于配置文件)


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

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

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

所以这最终是一个简单的清单问题

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


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

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

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

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

所以这最终是一个简单的清单问题

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


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

我认为这可能是由于mt.exe的缘故,因此修改了生成后事件以只生成清单并跳过嵌入(使我的程序集保持不变)。我仍然会犯同样的错误。尝试移动到较新版本的MT(SDK 8.1附带的版本),但也没有解决此问题。发现我的程序集中有对旧的2.0程序集的引用。我把它们取下来测试一下。同样的结果仍然存在,所以引用并不是导致我的问题的原因。我认为这可能是因为mt.exe,所以修改了生成后事件以仅生成清单并跳过嵌入(使我的程序集保持不变)。我仍然会犯同样的错误。尝试移动到较新版本的MT(SDK 8.1附带的版本),但也没有解决此问题。发现我的程序集中有对旧的2.0程序集的引用。我把它们取下来测试一下。同样的结果,所以引用并不是导致我的问题的原因。关于缓存机制,我找到了这个博客条目。缓存使得调试错误清单变得非常困难。这篇博文包含了一个变通方法,很高兴我能提供帮助。这里的关键是reg free COM被用来注册CLSID,而清单中没有包含垫片用来确定哪个运行时是合适的版本字符串。使用RegAsm或其他工具进行的典型注册会生成具有正确版本字符串的注册表项,显然mt.exe(至少是最新版本)也会获得此权限。请注意,这是“运行时版本”,类似于用于supportedRuntime配置元素的版本字符串,而不是用于.NET(3.5、4.5等)的“营销版本”。是的,最新(SDK 8.1)mt.exe的out确实包含正确的运行时版本。但是,安装在“7.0A”下的版本不适用。对于任何试图使用它来生成Reg Free COM清单的人来说,这只是一个警告。关于缓存机制,我找到了这个博客条目。缓存使得调试错误清单变得非常困难。这篇博文包含了一个变通方法,很高兴我能提供帮助。这里的关键是reg free COM被用来注册CLSID,而清单中没有包含垫片用来确定哪个运行时是合适的版本字符串。使用RegAsm或其他工具进行的典型注册会生成具有
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.