Загрузка собственной библиотеки dll (32-разрядной) во встроенном поставщике wmi (32-разрядная версия) в 64-разрядной ОС

StackOverflow https://stackoverflow.com/questions/5342890

  •  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.

здесь это статья, описывающая некоторые трудности

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top