C++ 使用清单的DLL重定向
我需要可靠地重定向特定DLL的应用程序查找。使用app.exe.local方法不起作用,因为如果应用程序具有清单(嵌入或单独的文件),则会忽略本地文件。因此,我试图通过在清单中将DLL定义为私有程序集来执行DLL重定向 我有一个测试应用程序LoadDll.exe,它只调用C++ 使用清单的DLL重定向,c++,windows,dll,manifest,C++,Windows,Dll,Manifest,我需要可靠地重定向特定DLL的应用程序查找。使用app.exe.local方法不起作用,因为如果应用程序具有清单(嵌入或单独的文件),则会忽略本地文件。因此,我试图通过在清单中将DLL定义为私有程序集来执行DLL重定向 我有一个测试应用程序LoadDll.exe,它只调用 LoadLibrary("C:\\EmptyDll.dll"); LoadDll.exe具有清单(作为单独的文件LoadDll.exe.manifest) 包含LoadDll.exe(不是c:\)的应用程序文件夹包含带有
LoadLibrary("C:\\EmptyDll.dll");
LoadDll.exe具有清单(作为单独的文件LoadDll.exe.manifest)
包含LoadDll.exe(不是c:\)的应用程序文件夹包含带有嵌入清单的EmptyDll.dll
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<assemblyIdentity
type="win32"
name="EmptyDll"
version="1.0.0.1"
processorArchitecture="x86"
/>
</assembly>
但是,LoadDll.exe会继续加载C:\EmptyDll.dll,而不是应用程序文件夹中的EmptyDll.dll
如果您破坏任一清单(例如更改EmptyDll.dll清单标识中的版本号),LoadDll.exe不会加载,因此windows正在读取和处理清单文件,但只是忽略了这些文件
有人有什么想法吗
谢谢
托比好的,你需要这样设置:
-您的测试应用程序exe文件c:\apppath\testapp.exe
-可能嵌入的应用程序清单文件c:\apppath\testapp.exe.manifest
-描述新程序集的清单c:\apppath\EmptyAssm\EmptyAssm.manifest
-程序集dllc:\apppath\EmptyAssm\empty.dll
-dll中嵌入的清单c:\apppath\EmptyAssm\empty.dll.2.manifest
-应用程序配置文件c:\apppath\testapp.exe.config
assemblyBinding
节点下包含一个探测节点(配置文件看起来很像清单文件),带有privatePath=“some relative path”
。在这种情况下,将在相对文件夹中搜索程序集
我在这里的最后一个响应包含示例文件,其中介绍了从dll创建程序集并从exe引用程序集的过程:-
我想澄清一下: win32程序集是(最简单的)描述程序集的清单文件和dll。 在此模型中,它们始终位于同一文件夹中,因此清单的文件节点根本不能包含任何路径信息—仅包含dll的名称 程序集可以共享—方法是为它们提供一个强版本(和一些数字签名),并将它们安装在Windows\WinSxS或private中 Windows 5.1之前的版本(Win XP)根本不会搜索程序集,因为这项技术只是在XP中添加的。 Windows 5.1至6.0(XP和Vista)将仅在具有活动激活上下文的对象文件夹中搜索专用程序集:-如果某个exe引用某个程序集,则包含该exe的文件夹。如果dll中的代码引用程序集,则会搜索dll的文件夹 如果要将dll存储在多个应用程序共享的专用位置(例如),则必须满足Windows 7或更高版本的要求:- Windows 6.1版(也称为Windows Server 2008或Windows 7)及更高版本将在模块文件夹之外,搜索指定为应用程序配置文件中探测元素的privatePath元素的路径。 应用程序配置文件始终与exe或dll位于同一文件夹中,并命名为:
.exe.config
或.dll.2.config
(使用.2.的原因是可能有大量清单和配置嵌入为资源,加载程序保留资源id的1…15。在磁盘上搜索配置文件的清单时,如果嵌入资源的资源id为1,则该id将被忽略,但任何其他数字表示它将成为文件名的一部分).您可以使用包装
LoadLibrary
来解决此问题。
LoadLibrary包装器将能够识别加载DLL的尝试并适当重写路径。因此,似乎不可能使用清单将调用重定向到具有绝对路径的LoadLibrary 在对清单进行了大量的处理之后,似乎一旦您克服了所有糟糕的文档清单,它实际上是非常简单的 基本上,当加载可执行文件时,windows会收集链接到u的所有相关清单
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<assemblyIdentity
type="win32"
name="EmptyDll"
version="1.0.0.1"
processorArchitecture="x86"
/>
</assembly>
'name attribute of file element' -> 'absolute path of manifest file' + 'name attribute of file element'