如何将.net app.config应用到进程外的COM服务器



我们有一个基于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)中运行。这就产生了一个问题,因为应用程序配置没有应用到dllhost.exe

我们想要解决这个问题,而不需要编写自定义代理,部署两个版本的c# COM服务器,需要v4.0运行时,或者手动托管CLR。

如何将应用程序配置应用于由COM Elevation Moniker创建的对象?

参考这个,你可能也读过:http://blogs.msdn.com/b/clrteam/archive/2010/06/23/in-proc-sxs-and-migration-quick-start.aspx

查看"托管COM组件"部分。除了更新注册表的相对简单的hack(我个人会避免这样做,因为通过反射筛选找到所有clsid可能并不酷)之外,我看到了这段文字:

如果一个托管COM组件是通过一个无注册表的清单(它不能被扩展为包含一个SupportedRuntimes条目)激活的,运行时激活将在包含COM可见类的程序集旁边查找一个配置文件

你可以尝试添加Plugin.dll.config到你的一个插件,看看这是否解决了这个问题?本文在我提到的部分下面有一些具体的示例,但从所有程度和目的来看,您至少可以复制/粘贴用于测试的内容(根据您的配置,有些部分您不需要)。

考虑到这是来自CLR团队的,我的假设是您的选择是reg hack或配置文件。

相关内容

最新更新