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

问题描述 投票:1回答: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.dll加载另一个dll LoadLibraryB.dll是从外国目录加载的,取决于dependency.dll,实际上需要使用dependency.dll使用的A.dll版本,该版本已经在内存中。

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

有没有办法可以强迫B.dll使用由dependency.dll加载的A.dll版本?

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

windows dll transitive-dependency activation-context-api
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”),这将无济于事。

© www.soinside.com 2019 - 2024. All rights reserved.