我们有一个基于COM的插件系统的遗留应用程序。要注册本机插件,会调用DllRegistryServer
,它会注册COM类并添加一些注册表信息以进行簿记。对于.NET组件,我们有一个用C#编写的COM服务器,它调用RegistrationServices.RegisterAssembly
。为了获得最大的兼容性,此C#dll以.NET v2.0为目标。 (本机)插件注册商CoCreateInstance()
是C#服务器。
由于.NET插件可能以.NET v4.0为目标,因此我们在应用程序配置中有以下内容:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!-- Load 4.0 if available, otherwise 2.0 -->
<!-- http://msdn.microsoft.com/en-us/library/w4atty68.aspx -->
<!-- http://msdn.microsoft.com/en-us/library/w671swch.aspx -->
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" />
<supportedRuntime version="v2.0.50727" />
</startup>
</configuration>
问题是COM注册需要在Vista或7中提升,因此插件注册器是使用COM Elevation Moniker创建的,它在系统代理(dllhost.exe
)中运行它的proc-of-proc 。这会产生问题,因为应用程序配置未应用于dllhost.exe
。
我们希望在不编写自定义代理,部署两个版本的C#COM服务器,需要v4.0运行时或手动托管CLR的情况下解决此问题。
如何将应用程序配置应用于由COM Elevation Moniker创建的对象?
答案 0 :(得分:1)
参考这个,您可能还读过: http://blogs.msdn.com/b/clrteam/archive/2010/06/23/in-proc-sxs-and-migration-quick-start.aspx
查看“托管COM组件”部分。除了相对简单的黑客更新注册表(我个人会避免,因为通过反思来查找所有的CLSID可能并不酷),我看到了这一点文字:
如果通过无注册清单激活托管COM组件(无法扩展以包含SupportedRuntimes条目),则运行时激活将查找包含COM可见类的程序集旁边的配置文件
您可以尝试将Plugin.dll.config添加到其中一个插件中,看看是否可以解决问题吗?所包含的文章在我提到的部分下面有一些具体的例子,但是出于各种程度和目的,你看起来至少可以复制/粘贴你的测试内容(更优雅的是你不需要的部分取决于你的配置)。
鉴于这是来自CLR团队,我的假设是你的选择是reg hack或配置文件。