如何将.NET app.config应用于进程外COM服务器?

时间:2011-08-27 19:01:24

标签: .net deployment 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)中运行它的proc-of-proc 。这会产生问题,因为应用程序配置未应用于dllhost.exe

我们希望在不编写自定义代理,部署两个版本的C#COM服务器,需要v4.0运行时或手动托管CLR的情况下解决此问题。

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

1 个答案:

答案 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或配置文件。