【问题标题】:Can I use manifests to specify an optional dependency on a COM server?我可以使用清单来指定对 COM 服务器的可选依赖项吗?
【发布时间】:2011-02-23 06:06:18
【问题描述】:

我想使用清单来指定对 COM 服务器的依赖 (reg-free COM)。

消费者应用程序在没有 COM 服务器的情况下大部分都可以正常工作 - 只有大约 1.7% 的功能使用 COM 服务器。因此,对于普通的旧 regsvr32,它会启动并正常工作,直到用户执行会触发 CoCreateInstance() 调用的操作,此时消费者会收到一条错误消息。

现在我已经玩了一段时间的清单,看起来除非它所依赖的 COM 服务器程序集存在于文件系统中,否则消费者甚至不会启动。这样不好。

我添加了具有以下内容的“附加清单”:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
   <dependency>
       <dependentAssembly>
           <assemblyIdentity
              type="win32"
              name="TheComServer.X"
              version="1.0.0.0"/>
       </dependentAssembly>
   </dependency>
</assembly>

有没有办法将无注册 COM 与清单一起使用并使依赖项成为可选 - 以便消费者程序启动并正常工作,直到实际调用 CoCreateInstance()

【问题讨论】:

  • 嘿,你发现了吗?这里同样的问题。这很烦人,如果依赖项不存在,应用程序根本不会运行,因为它是可选的(如插件或其他东西)。
  • @natenho 不,最终在没有明显依赖项的情况下工作。

标签: visual-studio visual-studio-2008 com manifest side-by-side


【解决方案1】:

您至少必须为无注册的 COM 程序集提供清单。

应用程序清单引用应用程序需要的程序集 - 组件清单在应用程序启动时处理 - 并指定程序集导出的 com 对象。

它们必须在加载激活上下文时被指定。

您可以使用激活上下文 API 手动创建一个激活上下文并将程序集加载到其中 - 然后在您尝试 CoCreateInstance 时确保该上下文是最新的。

【讨论】:

  • 是的,我知道必须指定它们。但是可以将它们指定为可选的吗?
  • 进程清单中的任何内容都会在应用程序启动时解决,并且没有可选依赖项的概念。因此,从流程清单中删除此信息,并使用此信息创建一个新清单。在您想要调用 CoCreateInstance 时,您可以加载第二个清单并使用激活上下文 API 手动激活它:msdn.microsoft.com/en-us/library/aa374151(VS.85).aspx 一直处理第二个清单不存在的情况。
猜你喜欢
  • 2011-02-23
  • 2016-07-25
  • 1970-01-01
  • 2023-03-12
  • 2016-02-29
  • 2014-07-30
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
相关资源
最近更新 更多