Загрузка собственной библиотеки DLL (32 бита) в провайдере wmi в процессе (32 бита) на 64-битной ОС - PullRequest
3 голосов
/ 17 марта 2011

Я работаю с внутрипроцессным wmi-провайдером, который загружает собственную стороннюю библиотеку, используя [DllImport].Расположение dll фиксируется в c: \ mydllpath.Перед загрузкой dll я устанавливаю текущий каталог в dll loaction, в методе провайдера Bind ().

Environment.CurrentDirectory = Environment.ExpandEnvironmentVariables ("% SystemDrive%") + "\ mydllpath";

Поставщик построен для «Любого ЦП», установлен с использованием gacutil и installexe.

gacutil.exe / if myprovider.dll

installutil.exe myprovider.dll

Работает нормально на всех 32-битных платформах Windows.Но на 64-битной платформе (пробовал с Windows 7 64-битной) она не работает, когда я тестирую из WMIC.Но когда я тестировал с помощью WMI Code Creator, он работал нормально.

После отладки я обнаружил, что выдает следующее сообщение об ошибке.

System.BadImageFormatException Дополнительная информация: Была предпринята попытка загрузить программус неверным форматом.(Исключение из HRESULT: 0x8007000B)

После поиска справки из Интернета было предложено создать провайдер для x86.Но провайдер, построенный на x86, выдает еще одну ошибку, например ...

ОШИБКА: Код = 0x80041013 Описание = Ошибка загрузки провайдера. Средство = WMI

Я также пытался загрузить собственные библиотеки DLL (фактически 2 библиотеки DLL).и файл sys) с использованием параметра командной строки / linkref, но не удалось из-за невозможности загрузить файл sys с помощью /linkref.

Я написал тестовое клиентское приложение C # и сохранил все файлы по одному пути, это былоработает нормально.Я надеюсь, что мне не хватает некоторых конфигураций для 64-битной установки.

Любая помощь будет очень признательна и очень благодарна заранее!

Ответы [ 2 ]

3 голосов
/ 24 марта 2011

Вам нужен код, чтобы быть 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-битного провайдера.

1 голос
/ 24 марта 2011

прости, приятель, здесь не повезло. Если ваш процесс (основной процесс, все запущено) работает 64-битно, вы не можете загрузить 32-битные нативные библиотеки DLL.

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

...