【发布时间】: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