Загрузка собственной библиотеки dll (32-разрядной) во встроенном поставщике wmi (32-разрядная версия) в 64-разрядной ОС
-
27-10-2019 - |
Вопрос
Я работаю над встроенным поставщиком wmi, который загружает собственную стороннюю библиотеку, используя [DllImport].Расположение DLL исправлено на c:\mydllpath.Перед загрузкой библиотеки dll я устанавливаю текущий каталог в dll loaction в методе провайдера Bind().
Окружающая среда.CurrentDirectory = Environment.ExpandEnvironmentVariables("%SystemDrive%") + "\mydllpath";
Provider создан для "Любого процессора", устанавливается с помощью gacutil и installexe.
gacutil.exe /если myprovider.dll
installutil.exe myprovider.dll
Он отлично работает на всех 32-разрядных платформах Windows.Но на 64-разрядной платформе (пробовал с Windows 7 64bit) она не работает, когда я тестирую из WMIC.Но когда я тестировал с помощью WMI Code creator, все работало нормально.
После отладки я обнаружил, что он выдает следующую ошибку.
Система.Исключение BadImageFormatException Дополнительная информация:Была предпринята попытка загрузить программу с неправильным форматом.(Исключение из HRESULT:0x8007000B)
После поиска справочной информации в Интернете было предложено создать провайдер для x86.Но провайдер, построенный с x86, выдает другую ошибку, например...
ОШИБКА:Код = 0x80041013 Описание = Сбой загрузки провайдера Объект = WMI
Я также попытался загрузить собственные библиотеки DLL (на самом деле 2 библиотеки DLL и файл sys), используя переключатель командной строки /linkref, но потерпел неудачу из-за невозможности загрузить файл sys с помощью /linkref.
Я написал тестовое клиентское приложение на C # и сохранил все файлы по одному и тому же пути, оно работало нормально.Я надеюсь, что мне не хватает некоторых конфигураций для 64-разрядной установки.
Любая помощь была бы действительно оценена и заранее большое спасибо!
Решение
Вам нужно, чтобы код был 64-битным?Вы можете указать Visual Studio скомпилировать ваш код на c # в 32-разрядный исполняемый файл, а затем использовать 32-разрядные собственные библиотеки DLL.Это будет прекрасно работать на 64-разрядной ОС.
.NET по умолчанию компилирует .net IL в любой собственный набор команд.В настройках проекта на вкладке сборка, если цель сборки установлена для "Любого процессора", то она будет скомпилирована до 64 бит на 64-разрядных платформах и 32 бит на 32-разрядных платформах.
Если вы измените это и принудительно выполните 32-разрядную компиляцию (установите для нее значение x86), то она будет компилироваться до 32-разрядной версии даже на 64-разрядных платформах, что позволит вам использовать ваши 32-разрядные библиотеки DLL.
Обновить:Перечитав свой вопрос, вы заявляете, что создаете встроенный поставщик WMI.Это указывало бы на то, что провайдеру, возможно, потребуется быть 64-разрядным на 64-разрядных платформах (я не знаю, так ли это).Если это так, то да..тебе не повезло.
ОБНОВЛЕНИЕ 2: Эта статья кажется, это указывает на то, что поставщики WMI не обязательно должны быть 64-разрядными в 64-разрядных ОС, за исключением "редких случаев", так что, возможно, вам сойдет с рук 32-разрядный поставщик.
Другие советы
извини, приятель, здесь мне не повезло.Если ваш процесс (основной процесс, все запущено) работает под управлением 64-разрядной версии, вы не сможете загрузить 32-разрядные собственные библиотеки DLL.
здесь это статья, описывающая некоторые трудности