1

我目前正在努力让 .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 应用程序来测试它们。我的应用程序有一个清单,它声明了依赖项。

如果我运行我的应用程序,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:\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.
4

1 回答 1

1

M. Miller from the CLR Team pointed me in the right direction. My manifest (generated by mt.exe from Windows SDK 7.0A) didn't include a value in the runtimeVersion of the clrClass tag.

This was causing the CLR Loader to get into a "Capped" loading path. This capped loading path, which from what M. Miller told me, happens when a version isn't v4 or higher and it caps the value returned by the loader's "FindLatestVersion" to v2. So it tries to load assemblies using the 2.0 FW.

Modifying the manifest to specify the proper version (v4.0.30319) and making sure nothing was cached (i had to copy my directory somewhere else, for the right version to appear in the logs), ended up solving my problem. Now the loading goes down the right path instead of going the "Capped" path.

So this ended up being a simple manifest issue.

FWIW, i tried generating the same manifest using mt.exe from Windows SDK 8.1 (latest one) and it generated the runtimeVersion attribute properly!

I would like to thanks Mark Miller for his help on this matter, without his help it would have taken a while for me to figure this out!

于 2013-09-05T21:22:18.867 回答