Как объединить две управляемые библиотеки DLL x86 / x64 в одну управляемую библиотеку AnyCpu?

Третья сторона компилирует неуправляемый код (отдельно x86 / x64) и предоставляет управляемые библиотеки DLL C # .NET для любой платформы (отдельно x86 / x64):

  • FooManaged_x86.dll
  • FooManaged_x64.dll

Это то, что я получаю (ни нативный код, ни неуправляемые библиотеки).

Затем я могу создать приложение (или библиотеку) C # .NET, ориентированное на x86 или x64, и напрямую ссылаться на соответствующую управляемую dll - все нормально, но ограничено одной конкретной платформой (не моя цель).

Мое приложение может нацеливаться на AnyCpu (моя цель), ссылаться на dll x64 (плохо, предупреждение компилятора), и оно будет работать только тогда, когда оно действительно работает как x64. Опять же, это привязано к одной конкретной платформе.

Я знаю, что могу объединить неуправляемые библиотеки DLL x86 / x64 (с Fody.Costura) в одну управляемую DLL, динамически загружая соответствующую DLL во время выполнения (используя DllImport и ручную AssemblyLoad под капотом). Я сделал это с большим успехом, но этот метод плохо подходит для управляемых dll. Мне бы пришлось использовать PInvoke из управляемого C # в управляемые библиотеки DLL C #, что для меня звучит неправильно.

В: Есть ли способ объединить две управляемые библиотеки DLL x86 / x64 в одну управляемую DLL AnyCpu без PInvoke?


person Patrick Stalph    schedule 13.12.2016    source источник
comment
Насколько мне известно, ссылка на x86 позволит вашей скомпилированной цели работать как на x86, так и на x64. Я даже думаю, что это позволит вам скомпилировать ваш проект на AnyCpu, а не только на x86, но я не совсем уверен.   -  person gilmishal    schedule 13.12.2016
comment
@gilmishal: Не тестировалось, но ... Для многих вещей x86 - хороший вариант по умолчанию, согласен. Однако моя сторонняя библиотека работает с большими файлами / наборами данных, поэтому 64-битная версия дает реальную пользу.   -  person Patrick Stalph    schedule 13.12.2016


Ответы (1)


Да, есть. Я успешно использовал LibZ для упаковки сборок смешанного режима в качестве ресурсов в управляемую сборку AnyCPU. Библиотека выбирает правильную сборку для платформы, на которой она работает.

Это метод, используемый тем же автором в lz4net.

Командная строка в вашем случае будет такой:

libz inject-dll --assembly YourAnyCpuLib.dll --include FooManaged.x86.dll --include FooManaged.x64.dll

Предостережение заключается в том, что сборка AnyCPU по-прежнему должна ссылаться на одну из зависимых от платформы библиотек, поэтому вы получите предупреждение во время сборки. Просто выберите тот, который вы используете для тестирования / разработки.

Также убедитесь, что сторонняя лицензия не запрещает вам встраивать сборки в свои собственные.

person Lucas Trzesniewski    schedule 13.12.2016
comment
Оказалось, что для моего конкретного сценария зависимости были слишком сложными (включая даже статические неуправляемые библиотеки) и в ужасном состоянии (я только что обнаружил, что x86 dll вообще не работает). Ни Costura, ни LibZ не поддерживают статические неуправляемые файлы (AssemblyResolve никогда не вызывается). Для более простых сценариев это, вероятно, сработает. - person Patrick Stalph; 21.12.2016