【问题标题】:How to apply .NET app.config to out-of-proc COM server?如何将 .NET app.config 应用于进程外 COM 服务器?
【发布时间】:2011-11-05 05:03:30
【问题描述】:

我们有一个带有基于 COM 的插件系统的遗留应用程序。为了注册一个原生插件,DllRegistryServer 被调用,它注册了 COM 类并添加了一些注册信息用于簿记。对于 .NET 组件,我们有一个用 C# 编写的 COM 服务器,它调用 RegistrationServices.RegisterAssembly。为了获得最大的兼容性,此 C# dll 以 .NET v2.0 为目标。 (本机)插件注册器CoCreateInstance()s 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 创建的对象?

【问题讨论】:

  • 入侵注册表是不合适的,它会阻止管理员保护机器。自 UAC 以来,它已经完全结束并完成了。旧版应用程序往往最终出现在虚拟机中。
  • 只有当您的插件中有不同的运行时版本时才会发生这种情况,还是即使一切都在 .NET 2.0 中也会发生这种情况?
  • @Hans:在 HKLM\Software\App\ 中使用一些特定于应用程序的信息的标准 COM 注册在 90 年代是合理的,但我同意现在已经非常过时了。

标签: .net deployment com


【解决方案1】:

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

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

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

您可以尝试将 Plugin.dll.config 添加到您的插件之一,看看这是否能解决问题?包含的文章在我提到的部分下方有一些具体示例,但从所有范围和目的来看,您至少可以复制/粘贴您所拥有的用于测试的内容(更优雅的是,有些部分您不需要,具体取决于你的配置)。

鉴于这是来自 CLR 团队,我在这里的假设是您的选择是 reg hack 或配置文件。

【讨论】:

  • 一个好主意,但不幸的是添加 dll.config 不起作用。即使通过 SxS 加载 .NET .dll,该进程也不会查找 .dll.config(由 Process Monitor 报告)
  • 您是否尝试过我在该示例中提到的另一种替代方法,将缺少的部分显式添加到注册表中?
  • 太好了,看来SupportedRuntimeVersions 有效。 RegistryValue Root="HKCR" Key="CLSID\{0BB...16}\InprocServer32" Name="SupportedRuntimeVersions" Value="v4.0.30319;v2.0.50727"。这很简单,因为我只想公开一个 CLSID。
猜你喜欢
  • 2014-02-18
  • 2013-01-20
  • 2012-09-06
  • 2010-10-04
  • 2011-05-17
  • 2015-05-23
  • 1970-01-01
  • 2011-01-23
  • 2012-10-10
相关资源
最近更新 更多