Как распределить 32 и 64-битные версии библиотеки

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

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

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

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

Ответ 1

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

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

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

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

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

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

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

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