我目前正在努力让 .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.