无注册 COM - COM dll 相对于客户端 exe 的位置

Posted

技术标签:

【中文标题】无注册 COM - COM dll 相对于客户端 exe 的位置【英文标题】:Reg-free COM - location of COM dll relative to client exe 【发布时间】:2011-02-09 15:47:29 【问题描述】:

我想使用免注册 com,这样我就不必注册我的旧版 com 组件。但是,我希望能够将 com dll 放在不在客户端 exe 目录中或之下的位置,例如....\库。我无法在服务器清单文件中执行此操作,因为它不允许相对或绝对路径。

有人知道有没有办法解决这个问题?


更新: 我只找到了在 XP 上工作的相对路径。但是,我可以使用 Activation Context API 在 Windows Server 2008 上使用绝对路径,这很酷。我现在的问题是我的 COM 组件对托管数据库驱动程序具有静态依赖关系,但目前它没有找到它。从我所读到的关于清单文件的内容中,我希望我可以简单地将另一个元素添加到指向这个 dll 的 COM reg-free 清单中,因为它与 COM dll 位于同一目录中,但我无法让它工作。所以,总而言之,我在一个目录中有一个 exe,它使用激活上下文 API 来引用另一个目录(不是 exe 目录的子目录)中的 COM 清单/dll,它可以正确找到并加载。但是我在与 COM dll 相同的目录中也有一个托管数据库驱动程序 dll,我想知道如何使用清单文件加载它 - 如果可能的话。

【问题讨论】:

只是补充一点——我也尝试过使用激活上下文 api。如上所述,我希望我的客户端加载一个与 client.exe 不在同一目录中的 COM dll。我试图通过将激活上下文中的程序集目录设置为指向包含清单文件和 COM dll 的目录来做到这一点。结果是正确找到了清单文件,但是当它尝试加载随附的 dll 时,它会查找相对于 client.exe 的路径,而不是找到清单的目录。我错过了什么吗? 相对路径确实有效,即您可以将 dll 放在相对于 exe 的 .\External 文件夹中。只需在清单中使用<file name="External\My.dll"> 我猜这是相对的,但它只适用于相同或更低的目录级别。 【参考方案1】:

我通过以父目录作为当前目录运行 exe 来实现这一点。 即具有此文件夹结构

父目录/ 父目录/myapp/ parentdir/somedependency/

然后以“parentdir”作为当前目录,你可以运行你的exe “.\myapp\myapp.exe” 并且 myapp.exe.manifest 可以包含对“somedependency”中某些内容的引用

<file name=".\somedependency\somecomassembly.dll" />

这适用于 Windows 服务器

【讨论】:

能否展示一个示例 .manifest 供客户端相对引用服务器?

以上是关于无注册 COM - COM dll 相对于客户端 exe 的位置的主要内容,如果未能解决你的问题,请参考以下文章

隔离(无注册)COM 组件行为

为啥 C# 需要注册 COM DLL 才能引用它?

无法调试 COM 注册库

免注册 COM/DLL?

如果 com dll 未注册,如何防止崩溃

将 .dll 注册到 COM 时出错