0

我有一个本机 C++ DLL,它用作另一个应用程序中的插件。此 DLL 有一个嵌入式清单并依赖于位于应用程序外部文件夹中的私有程序集。应用程序无法加载我的插件 DLL,因为我的 DLL 依赖于一个从未找到的私有程序集(它不在应用程序目录中,也不在 winsxs 文件夹中,而是在我的插件目录中,其位置不受控制应用程序)。问题是:如何让系统找到位于我自己特定目录中的私有程序集?作为一个类比,我需要一个等价的 setDllDirectory() 但对于程序集。或者另一种方式让系统找到我的私人程序集。

约束:

因为我的 DLL 是一个插件,所以我无法在应用程序的目录和子目录中安装任何东西。我也无法修改应用程序的行为。
我想避免在 winxs 中共享程序集。
我还必须使用程序集而不是简单的 DLL(我可以使用 LoadLibrary 加载)以避免版本冲突。

谢谢。

4

1 回答 1

0

您需要有一个全局位置,您可以在其中提供构成您的(来自 java-terminology)类路径的目录列表。一旦你有了这个列表,只需遍历寻找 dll 的目录。

为此,我在 Windows 中使用了注册表。环境变量或 linux 下的 /etc 文件夹也可以。

这就是链接器的工作方式,也是 .NET GAC 的一种方式(它在注册表项中指定目录列表)。

-- 编辑 1 --

您的问题似乎很不舒服,就像尝试穿上一件直筒夹克吃饭一样:P。为什么不放弃组装要求并在本机 DLL 中拥有一个返回版本标识符(名称-版本)的函数,然后有一些应用程序逻辑来确定它是否可以使用 DLL。

例如 file-name (fn) = monkey-1-1 并且函数调用返回一个结构:

struct version-id
{
   const char * name;
   int major_number;
   int minor_number;
};

然后 fn monkey-1-2 不会在文件名或内部转换上发生冲突。并且您的编程约定或应用程序逻辑将确保不会发生不利的冲突。

于 2009-12-08T11:46:58.063 回答