如何指定要使用已加载的并排程序集的哪个实例
How to specify which instance of an already loaded side-by-side assembly to use
我正在创建一个 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
通过 LoadLibrary
加载另一个 dll B.dll
。 B.dll
是从外部目录加载的,依赖于 dependency.dll
并且实际上需要使用内存中已经存在的 A.dll
使用的 dependency.dll
版本。
问题是 B.dll
使用 app.exe
使用的 dependency.dll
版本,因为这是已加载到内存中的同名模块的第一个版本。
有什么方法可以强制 B.dll
使用 A.dll
加载的 dependency.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 不能进行静态加载,因为它是真正动态检测到的,这根本不起作用。
如果"same"的要求真的只有"same version",你可以再做一个装配:
<?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") 本身,这将无济于事。
我正在创建一个 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
通过 LoadLibrary
加载另一个 dll B.dll
。 B.dll
是从外部目录加载的,依赖于 dependency.dll
并且实际上需要使用内存中已经存在的 A.dll
使用的 dependency.dll
版本。
问题是 B.dll
使用 app.exe
使用的 dependency.dll
版本,因为这是已加载到内存中的同名模块的第一个版本。
有什么方法可以强制 B.dll
使用 A.dll
加载的 dependency.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 不能进行静态加载,因为它是真正动态检测到的,这根本不起作用。
如果"same"的要求真的只有"same version",你可以再做一个装配:
<?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") 本身,这将无济于事。