Фон
У нас есть библиотека .NET, которая ссылается на одну из наших неуправляемых библиотек, скажем:
Пока что Unmanaged.dll является только 32-разрядным, поэтому DotNet.dll помечен как 32-разрядный тип процессора.
64-битная поддержка должна быть добавлена. Как организовать dll?
IL-код DotNet.dll будет одинаковым как для 32-разрядных, так и для 64-разрядных версий.
Вариант 1
- Папка 32-битных библиотек
- DotNet.dll, тип процессора 32-битный
- Unmanaged.dll, скомпилированный как 32-битный
- 64-битная папка библиотек
- DotNet.dll, тип процессора 64-битный
- Unamanged.dll, скомпилированный как 64-битный
В этом случае разработчик, использующий эти библиотеки, вынужден создавать 2 приложения: 32-битное и 64-битное. Но в этом случае точно известно, что происходит.
Вариант 2
Это то же самое, что и вариант 1, за исключением того, что DotNet.dll имеет тип процессора AnyCPU.
- Папка 32-битных библиотек
- DotNet.dll, тип процессора AnyCPU
- Unmanaged.dll, скомпилированный как 32-битный
- Папка 64-битных библиотек
- DotNet.dll, тип процессора AnyCPU
- Unamanged.dll, скомпилированный как 64-битный
Мне не нравится этот, потому что разработчик, использующий эти библиотеки, при перераспределении своего приложения не может хорошо сделать так, чтобы их приложение не зависало без установки типа CPU для их приложения:
- Если они используют 32-битную папку библиотек, на 64-битной ОС их процесс завершится сбоем
- Если они используют 64-битную папку библиотек, в 32-битной ОС их процесс завершится сбоем
Это делает Вариант 1 превосходящим Вариант 2.
Вариант 3
- Unmanaged_x32.dll, скомпилированный как 32-разрядный
- Unmanaged_x64.dll, скомпилированный как 64-битный
- DotNet.dll, тип процессора AnyCPU
DotNet.dll во время выполнения определит, с какой разрядностью он запускается, затем вызовет правильный файл Unmanaged.dll.
Вопрос (ы)
- Как разработчик этих библиотек, какой вариант имеет смысл?
- Как разработчик, использующий библиотеку DotNet.dll, какой вариант имеет смысл?
- Для варианта 3, если вы используете DotNet.dll, хотите ли вы знать, что библиотека во время выполнения определяет, какой Unmanaged.dll использовать?
- Как насчет перераспределения вашего приложения с этими библиотеками?
- Не хватает какой-нибудь опции?