1

我正在创建一个 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.dllLoadLibraryB.dlldependency.dlldependency.dllA.dll

问题是使用了byB.dll的版本,因为这是已加载到内存中的具有该名称的模块的第一个版本。dependency.dllapp.exe

有没有办法强制B.dll使用dependency.dll已加载的版本A.dll

语言是 C++,如果相关的话。

4

1 回答 1

0

我不知道你是否可以这样做,但这在某些出现这种情况的情况下会起作用:

<?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") ,这将无济于事。

于 2018-09-06T22:59:09.680 回答