我已经搜索了任何提示我是如何做到这一点的,但我发现的只是如何将SxS DLL重定向到本地应用程序文件夹。 这是我想要完成的: (C ++)Application.exe链接到DLL,Plugin.DLL(依赖项目)。此DLL不是放在应用程序目录中,而是放在名为“plugins”的子文件夹中。由于DLL是静态链接的,应用程序将尝试从应用程序文件夹加载它。
有什么方法可以更改此特定DLL的搜索路径吗?通过清单还是VS2008链接器配置?
答案 0 :(得分:17)
我的第一个想法是,如果你静态链接一个DLL,它不是一个插件。只需将dll放在EXE文件夹中即可完成。这是静态加载的DLL支持的窗口部署配置。
那说,有办法实现你想要的。但是他们大多是愚蠢的,或者没有充分理由感到复杂:你的选择是:
要将包含一个或多个dll的文件夹转换为“程序集”,只需将文件添加到文件夹name.manifest的文件夹中。
所以,plugins.manifest: -
<assembly manifestVersion="1.0">
<assemblyIdentity type="Win32" name="Plugins" version="1.0.0.0" processorArchitecture="x86" />
<file name="Plugin.dll"/>
</assembly>
确保文件夹和dll的名称不同,这是一个非常好的主意,好像dll名称是程序集名称windows开始查看其嵌入式清单文件以获取有关程序集的信息。
假设您使用的是Visual Studio 7或更高版本,则在项目中添加到.c / .cpp或.h文件的以下指令将使您的应用程序尝试从程序集而不仅仅是本地目录加载dll:
#pragma comment(linker, "/manifestdependency:\"name='Plugins' "\
"processorArchitecture='*' version='1.0.0.0' "\
"type='win32'\"")
答案 1 :(得分:7)
扩展&#34;&#34;汇编&#34;子目录:
附注:克里斯还有两篇关于更多细节的优秀写作:
DLL redirection using manifests至Answer
这也解释了如何利用应用程序配置文件中的probing privatePath
将DLL放在子文件夹之外。
这实际上称为A way to load DLL from central repository,MS文档以这种方式解释:
私有程序集安装在应用程序的文件夹中 目录结构。通常,这是包含该文件夹的文件夹 应用程序的可执行文件。私有程序集可以部署 与应用程序相同的文件夹,在与其名称相同的文件夹中 程序集,或具有相同名称的语言特定子文件夹 作为集会。
例如(...)
Appdir\Microsoft.Tools.Pop\Microsoft.Tools.Pop.MANIFEST
:清单被部署为具有程序集名称的子文件夹中的单独文件。(...)
可以通过任何可以将程序集文件复制到此文件夹的安装方法来安装专用程序集,例如
xcopy
命令。
您在程序文件夹C:\Test\Program\app.exe
中获得了可信赖的旧可执行文件,并且您希望 - "Private Assembly" - 从Plugins
子文件夹加载您的DLL文件,即{ {1}} 没有搞乱C:\Test\Program\plugins\tool1.dll
或任何其他内容。
你需要:
使用以下命令编译app.exe:
PATH
注意:我的测试系统需要编译/链接,而不是使用外部清单(#pragma comment(linker, "/manifestdependency:\"name='Plugins' version='1.0.0.0' type='win32'\"")
// name, type and version seems to be the minimum info to get away with
),我还没有找到原因。 (* A)
的工作原理然而,使用app.exe.manifest
工具将下面列出的清单文件嵌入/合并到可执行文件中,而不是使用链接器编译指示。 (mt
)
将tool1.dll放入Configuration > Manifest Tool > Additional Manifest Files
子文件夹
plugins
,其中一个如下所示:plugins.manifest:
C:\Test\Program\plugins\plugins.manifest
那就是它。启动app.exe将在Load-Time中自动在子文件夹中找到dll。
(* a):合并此清单文件有效,但您不能将其用作唯一的外部清单文件,我怀疑它是因为它缺少所有其他清单信息构建系统已经放入您的可执行文件中了!
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
type="win32"
name="Plugins"
version="1.0.0.0"
/>
<file name="tool1.dll"/>
</assembly>