Как распространять 32- и 64-битные версии библиотеки - PullRequest
11 голосов
/ 27 февраля 2012

У меня есть библиотека C #, которая вызывается различными клиентами (как 32-разрядными, так и 64-разрядными). До сих пор он был скомпилирован как AnyCPU, поэтому проблем не было.

Недавно я добавил зависимость от библиотеки SQLite .NET, которая доступна как в 32-, так и в 64-битном вариантах (но не в AnyCPU). Итак, теперь у меня должно быть 2 билда - для обеих битностей.

В прошлом я видел другие библиотеки (вспоминается MS SQL Compact), в которых была схема, в которой одна сборка .NET содержала бы папки Private\amd64 и Private\x86 в папках с соответствующими собственными библиотеками в их, и это будет называть каждого по мере необходимости.

Является ли этот подход жизнеспособным для моей ситуации? Есть ли документация о том, как это реализовать? Требуются ли изменения кода или это метод распространения?

Ответы [ 2 ]

6 голосов
/ 27 февраля 2012

Есть несколько способов справиться с этим.Изменения кода (небольшие) требуются для первых трех подходов:

A.Вы можете изменить PATH так, чтобы он указывал на конкретную папку платформы во время запуска приложения.Затем .NET автоматически загрузит локальные библиотеки DLL из этой папки.

B.Вы можете подписаться на событие AssemblyResolve и затем выбрать сборку, основанную на платформе.

Ознакомьтесь с постом Скотта Билиаса в блоге на этом http://scottbilas.com/blog/automatically-choose-32-or-64-bit-mixed-mode-dlls/. Обратите внимание, что он предпочитает подход А.

"В двух словах, решение состоит в том, чтобы обмануть загрузчик! Ссылка на p4dn.dll, который не существует, и использование события AssemblyResolve для перехвата загрузки и перенаправления ее на сборку правильного размера."

C.Используйте специфичный для платформы набор exe.configs и элемент codebase, чтобы определить места сборки.Ваша установка установит правильную на основе платформы.

http://msdn.microsoft.com/en-us/library/4191fzwb.aspx

D.Запишите две установки, одну для 32-битной и одну для 64-битной, затем установите только соответствующие файлы для платформы.

1 голос
/ 27 февраля 2012

Вы можете загрузить соответствующую сборку на лету, используя System.Reflection.Assembly.Load

См .: http://msdn.microsoft.com/en-us/library/system.reflection.assembly.aspx

...