我已经搜索了任何提示,我可以做到这一点,但我发现是如何将SxS DLL重定向到本地应用程序文件夹.
这是我想要完成的:
(C)Application.exe链接到DLL,Plugin.DLL(依赖项目).这个DLL没有放在应用程序目录中,而是放在一个名为“plugins”的子文件夹中.由于DLL是静态链接的,应用程序将尝试从应用程序文件夹中加载它.
这是我想要完成的:
(C)Application.exe链接到DLL,Plugin.DLL(依赖项目).这个DLL没有放在应用程序目录中,而是放在一个名为“plugins”的子文件夹中.由于DLL是静态链接的,应用程序将尝试从应用程序文件夹中加载它.
解决方法
我的第一个想法是,如果你是静态链接一个DLL,它不是一个插件.只需将DLL放在EXE文件夹中即可完成.这就是由静态加载的DLL支持的部署配置.
也就是说,有办法实现你想要的.但是他们大多是愚蠢的,或者是复杂的,没有什么好的理由:你的选择是:
>不要静态链接.使用LoadLibrary(“plugins / Plugin.dll”)& GetProcAddress访问插件内容.
>将“插件文件夹的路径”添加到系统PATH环境变量中.
>使用延迟加载机制延迟访问插件功能,设置可以使用提供的路径加载dll的custom helper function.
>将plugins文件夹转到程序集中(通过创建一个列出plugin.dll的.manifest文件).将“插件”作为依赖程序集添加到您的应用程序.现在它将在plugins文件夹中查找.
>将应用程序拆分成stub exe和动态加载的部分.在stub exe中调用SetDllDirectory指向plugin文件夹,然后调用LoadLibrary将完整路径传递给“appstub.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'\"")