如何指定要使用已加载的并排程序集的哪个实例

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.dllB.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") 本身,这将无济于事。