Как указать, какой экземпляр уже загруженной параллельной сборки использовать - PullRequest
0 голосов
/ 06 сентября 2018

Я создаю 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 загружает другую DLL B.dll через LoadLibrary. B.dll загружается из стороннего каталога, зависит от dependency.dll и фактически требует использования версии dependency.dll, используемой A.dll, которая уже находится в памяти.

Проблема в том, что B.dll использует версию dependency.dll, используемую app.exe, поскольку это была первая версия модуля с таким именем, которая была загружена в память.

Есть ли способ заставить B.dll использовать версию dependency.dll, которая была загружена A.dll?

Язык - C ++, если это актуально.

1 Ответ

0 голосов
/ 07 сентября 2018

Я не знаю, можете ли вы сделать это, но это сработает в некоторых случаях, когда это происходит:

<?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").

...