相关疑难解决方法(0)

使用同一DLL的多个版本

我的任务是为应用程序创建一个新模块,因此,我正在为项目添加新的DLL.这一切都很好.

但是,在我的DLL中,我想使用新版本的外部DLL(我无法控制).如果我只引用新的DLL并仅使用该DLL,我的代码将起作用,但旧代码将停止运行.

Could not load file or assembly 'itextsharp, Version=5.0.6.0, Culture=neutral,
PublicKeyToken=8354ae6d2174ddca' or one of its dependencies. The located assembly's
manifest definition does not match the assembly reference. (Exception from HRESULT:
0x80131040)
Run Code Online (Sandbox Code Playgroud)

我尝试过一个改变DLL名称的简单技巧,但这显然对我来说太天真了,认为它会起作用.我尝试使用外部别名(通过在我的引用中定义它们),但我仍然不知道如何将两个具有相同名称的文件放入一个BIN文件夹中...

我该怎么办?

c# reference .net-4.0 visual-studio-2010

26
推荐指数
4
解决办法
4万
查看次数

如何隔离依赖关系与传递依赖解析?

我正在开发一个应用程序,它为客户提供插件接口,以便在应用程序内开发他们的逻辑。然后在运行时动态加载插件。我们为插件提供了一个干净的 C 接口,使事情尽可能可移植。然而,我们最近发现了过渡依赖项的一个问题:当插件链接到它自己的依赖项时,这恰好也是应用程序的依赖项,仅加载应用程序附带的版本。

所以在下面的配置中,lib_b.dll是插件,它用作lib_a.dll私有依赖项。尽管因为Executable还链接到同一库的不同版本,但未选择它们的版本。

    +----------------------+              +-------------------------------+
    |                      | LoadLibrary  |                               |
    | Executable.exe ------+--------------+--> plugins                    |
    |  |                   |              |     |                         |
    |  +--> lib_a.dll (v1) |              |     +--> lib_b.dll            |
    |                      |              |           |                   |
    +----------------------+              |           +--> lib_a.dll (v2) |
                                          |                               |
                                          +-------------------------------+
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种解决方案来将地址空间和依赖符号与我的应用程序隔离。这个想法是Executable只关心运行时从插件加载的符号,而不是插件内部使用的符号。

我们像这样加载_library:

HMODULE h = ::LoadLibraryExA(".../plugins/library_b.dll", 
    NULL, LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR);
Run Code Online (Sandbox Code Playgroud)

该插件中唯一有趣的一点是这样实现的:

callback_type do_the_thing_in_b = GetProcAddress(h, "do_the_thing_in_b");
int answer = do_the_thing_in_b(3.14, 42);
Run Code Online (Sandbox Code Playgroud)

更新

应用程序可以随时重新编译或更改,但在编译时我们没有插件的信息。这个想法是客户可以创建自己的插件并将其放在那里。

我们也无法修改插件。我们可以扫描该目录并执行一些操作,但这就是我们可以执行的更改范围。我们无法重新编译它们或决定它们的依赖结构。

插件通过接口库再次链接我们的可执行文件,并直接从可执行文件调用函数

c++ windows dll

9
推荐指数
1
解决办法
388
查看次数

标签 统计

.net-4.0 ×1

c# ×1

c++ ×1

dll ×1

reference ×1

visual-studio-2010 ×1

windows ×1