在仅适用于.NET-4的系统上的GAC中使用面向.NET-2.0的COM DLL

再次问候,

按照我之前的问题,我正在尝试最大化我的C#编写的Windows资源管理器扩展的兼容性。 特别是,我有兴趣确保它在安装了.NET 4并且安装.NET 3.5及更低版本的环境中工作。 人们会认为没有问题,但显然不是那么简单……

有两个问题。 首先,非.NET-4目标程序集不会加载CLR 4,除非它们具有指定.config文件。 如果没有这个.config文件,即使尝试在它们上使用ngen也会失败。 但我的DLL进入了GAC。 我如何在那里获得.config文件? 其他人也问过同样的事情,并得出结论“好吧,我只会改为创建一个静态的设置类。” 显然我做不到……

第二个问题:当我用regasm.exe注册我的DLL,然后打开注册表查看它写的内容时,我在其CLSID条目下看到RuntimeVersion = v2.0.50727 。 这也可以防止加载DLL。 只有在我手动将RuntimeVersion值更改为RuntimeVersion后,DLL v4.0.30319加载。

那么我必须让我的安装程序在这里做什么? 对于第一个我不知道。 对于第二个,我想我必须让安装程序手动设置注册表的RuntimeVersion到任何.NET版本安装? 这看起来太古怪了……

.Net 2.0 – 3.5和.Net 4.0有两种不同的GAC,如果我没记错的话。

“大小问题部分解决了.NET 4安装程序(x86 + x64)为54 MB并且没有嵌入以前版本的完整运行时安装包。” – http://en.wikipedia.org/wiki/.NET_Framework

因此,如果您安装.Net 3.5,您将获得之前的.Net运行时。 这可能会与.NET 4.0混淆,后者不包含这些以前的运行时。 我相信这意味着您需要在.Net 4.0旁边安装.Net 3.5运行时才能将<= .Net 3.5运行时安装到GAC中。

我也相信如果你改变了RuntimeVersion,你就会得到.DLL安装到错误的GAC中。 然而,如果这确实有效,那将是有趣的。 我不相信它在实时环境中,但确实非常有趣。