2013-09-05 59 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清单的人来说,都只是一个警告。 –

相关问题