我正在创建一个dll(A.dll
),它是孤立的(ISOLATION_AWARE_ENABLED
),依赖于dependency.dll
并有一个清单文件:
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<assemblyIdentity name="my.assembly.name" version="1.0.0.0" type="win32"/>
<file name="A.dll"></file>
<file name="dependency.dll"></file>
</assembly>
A.dll
由一个应用程序app.exe
加载,它本身依赖于不同版本的dependency.dll
。清单确保两个版本的dependency.dll
并排使用。到目前为止没问题。
现在,A.dll
通过B.dll
加载另一个dll LoadLibrary
。 B.dll
是从外国目录加载的,取决于dependency.dll
,实际上需要使用dependency.dll
使用的A.dll
版本,该版本已经在内存中。
问题是B.dll
使用dependency.dll
使用的app.exe
版本,因为这是带有该名称的模块的第一个版本已加载到内存中。
有没有办法可以强迫B.dll
使用由dependency.dll
加载的A.dll
版本?
语言是C ++,如果这是相关的。
我不知道你是否能做到这一点,但是这会在一些出现这种情况的情况下起作用:
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<assemblyIdentity name="my.assembly.name" version="1.0.0.0" type="win32"/>
<file name="A.dll"></file>
<file name="B.dll"></file>
<file name="dependency.dll"></file>
</assembly>
如果B.dll不能成为静态负载,因为它是真正动态检测到的,这根本不起作用。
如果“相同”要求实际上只是“相同版本”,则可以进行另一个程序集:
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<assemblyIdentity name="b.assembly.name" version="1.0.0.0" type="win32"/>
<file name="B.dll"></file>
<file name="dependency.dll"></file>
</assembly>
如果这两种情况都不成立,那么剩下两种选择:
1)进行进程外调用。
2)实现自己的DLL加载器并使依赖项解析按您希望的方式工作。如果B.DLL本身执行LoadLibrary(“dependency.dll”),这将无济于事。