Как распространять 32-и 64-разрядные версии библиотеки
У меня есть библиотека C#, которая вызывается различными клиентами (как 32-разрядными, так и 64-разрядными). До сих пор он был скомпилирован как AnyCPU, поэтому не было никаких проблем.
Недавно я добавил зависимость в библиотеку SQLite .NET, которая поставляется как в 32-х, так и в 64-битных вариантах (но не AnyCPU). Итак, теперь у меня должно быть 2 сборки - для обеих разрядностей.
В прошлом я видел другие библиотеки (MS SQL Compact приходит на ум), которые имели схему, где одна сборка .NET имела бы Privateamd64 и Privatex86 папки в папки с соответствующими собственными библиотеками в них, и он будет вызывать каждую из них по мере необходимости.
Является ли этот подход жизнеспособным для моей ситуации? Есть ли документация о том, как ее реализовать? Требуются ли изменения в коде или это метод распространения?
2 ответов:
Есть несколько способов справиться с этим. Изменения кода (небольшие) требуются для первых трех подходов:
A. Вы можете изменить путь, чтобы указать на конкретную папку платформы во время запуска приложения. Затем .NET автоматически загрузит локальные библиотеки DLL из этой папки.
B. Вы можете подписаться на событие AssemblyResolve, а затем выбрать сборку на основе платформы.
Проверьте сообщение Скотта Билиаса в блоге на эту тему http://scottbilas.com/blog/automatically-choose-32-or-64-bit-mixed-mode-dlls / . заметим, что в конечном итоге он предпочитает подход A.
" в двух словах, решение состоит в том, чтобы обмануть загрузчик! Ссылка на p4dn.dll, которая не существует, и используйте событие AssemblyResolve, чтобы перехватить загрузку и перенаправить ее в сборку правильного размера бита."
C. используйте специфичный для платформы набор exe.конфигурации и элемент codebase для определения расположения сборок. Ваша программа установки установит правильный один основан на платформе.
Http://msdn.microsoft.com/en-us/library/4191fzwb.aspx
D. напишите две настройки, одну для 32-разрядной и одну для 64-разрядной, а затем установите только соответствующие файлы для платформы.
Вы можете загрузить соответствующую сборку на лету, используя System.Отражение.Собрание.Нагрузка
См.: http://msdn.microsoft.com/en-us/library/system.reflection.assembly.aspx
Comments