Как использовать правильный неуправляемый файл DLL в соответствии с архитектурой процессора?(32/64 бит) - PullRequest
7 голосов
/ 03 сентября 2010

Я должен использовать C ++ DLL-файл с сайта ASP.NET. Сайт будет размещен в 32- и 64-разрядных средах.

У меня 32-битная и 64-битная версия неуправляемого DLL-файла. Как импортировать методы из правильного в соответствии с текущей архитектурой сервера?

Как кто-то написал, это может быть решено как проблема развертывания. Я обеспокоен тем, что веб-приложение, использующее этот DLL-файл, огромно, и у нас нет документа для развертывания. Никто не помнит, чтобы развернуть правильный файл DLL, поэтому я пытаюсь удалить человеческий фактор из решения:)

Ответы [ 3 ]

5 голосов
/ 04 сентября 2010

Самый простой подход - дать двум собственным библиотекам одинаковое имя файла в двух разных каталогах, а затем настроить путь поиска DLL вашего приложения в зависимости от разрядности.

http://www.pinvoke.net/default.aspx/kernel32.setdlldirectory

1 голос
/ 11 ноября 2017

Как мы знаем, мы не можем добавлять неуправляемые файлы DLL, используя ссылку add. Поэтому нам нужен альтернативный способ обработки неуправляемых файлов DLLS в соответствии с архитектурой процессора, то есть добавление файлов DLL в каталоги вашего проекта.

  1. Создайте в своем проекте новые папки с именами x32 и x64.
  2. Скопируйте файлы DLL в эти папки в соответствии с архитектурой.
  3. Выберите файлы и откройте свойства, измените «Копировать в выходной каталог: всегда копировать»
  4. Повторите это для всех файлов в обеих папках

Теперь создайте свой проект на любой платформе, когда вы соберете проект. Папка x86 и x64 будет скопирована в папку bin. Когда он будет работать на сервере, он будет использовать неуправляемые файлы DLL в соответствии с архитектурой процессора.

1 голос
/ 04 сентября 2010

Чтобы компилятор / фреймворк выполняли большую часть работы, вам нужно, чтобы

  1. имели несколько сборочных «платформ» (обычно x86, x64 - удаляют AnyCPU)
  2. устанавливайте каждыйКонфигурация «целевой платформы» для каждой конфигурации сборки
  3. мы добавили условные символы компиляции __WIN32 и __X64

Перечислите различные реализации для ваших функций в зависимости от платформы, включая различные имена DLL, если вам нужночтобы оба были установлены одновременно.

#if __WIN32
        public delegate int Move(int target);
        [DllImport("my.dll", SetLastError = true, CharSet = CharSet.Auto)]
#elif __X64
        public delegate int Move(int target);
        [DllImport("my64.dll", SetLastError = true, CharSet = CharSet.Auto)]
#endif

В противном случае вы можете использовать loadlib и управлять сборкой самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...