3

[DllImport]を使用してネイティブのサードパーティライブラリをロードするインプロセスのwmiプロバイダーに取り組んでいます。dllの場所はc:\mydllpathに固定されています。dllをロードする前に、プロバイダーのBind()メソッドで現在のディレクトリをdllの場所に設定しました。

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

プロバイダーは「任意のCPU」用に構築され、gacutilおよびinstallexeを使用してインストールされます。

gacutil.exe / if myprovider.dll

installutil.exe myprovider.dll

すべての32ビットWindowsプラットフォームで正常に動作しています。しかし、64ビットプラットフォーム(Windows 7 64ビットで試してみました)では、WMICからテストすると機能しません。しかし、WMIコードクリエーターでテストしたところ、正常に機能していました。

デバッグした後、次のエラーがスローされていることがわかりました。

System.BadImageFormatException追加情報:誤った形式のプログラムを読み込もうとしました。(HRESULTからの例外:0x8007000B)

インターネットからヘルプを検索した後、x86のプロバイダーを構築することが提案されました。しかし、x86で構築されたプロバイダーは次のような別のエラーを出します...

エラー:コード=0x80041013説明=プロバイダーの読み込みエラー機能=WMI

また、/ linkrefコマンドラインスイッチを使用してネイティブdll(実際には2つのdllとsysファイル)を読み込もうとしましたが、/linkrefを使用してsysファイルを読み込めなかったため失敗しました。

テスト用のC#クライアントアプリケーションを作成し、すべてのファイルを同じパスに保持しましたが、正常に機能していました。64ビットインストール用のいくつかの構成が欠落していることを願っています。

どんな助けでも本当にありがたいです、そして前もって非常に感謝します!

4

2 に答える 2

3

コードを 64 ビットにする必要がありますか? C# コードを 32 ビットの実行可能ファイルにコンパイルしてから、32 ビットのネイティブ DLL を使用するように Visual Studio に指示できます。これは 64 ビット OS で正常に動作します。

.NET はデフォルトで、ネイティブ命令セットが何であれ、.net IL をコンパイルします。ビルド タブのプロジェクト設定で、ビルド ターゲットが「任意の CPU」に設定されている場合、64 ビット プラットフォームでは 64 ビットにコンパイルされ、32 ビット プラットフォームでは 32 ビットにコンパイルされます。

これを変更して 32 ビット コンパイルを強制すると (x86 に設定)、64 ビット プラットフォームでも 32 ビットにコンパイルされ、32 ビット DLL を使用できるようになります。

更新: 質問を読み直すと、インプロセス WMI プロバイダーを構築していると述べています。これは、プロバイダーが 64 ビット プラットフォーム上で 64 ビットである必要があることを示しています (そうであるかどうかはわかりません)。もしそうなら、ええ..あなたは運が悪い.

UPDATE2: この記事は、「まれな状況」を除いて、WMI プロバイダーは 64 ビット OS 上で 64 ビットである必要はないことを示しているようです。

于 2011-03-24T19:28:00.083 に答える
1

ごめんね、運が悪かった。プロセス (すべてが開始されたメイン プロセス) が 64 ビットで実行されている場合、32 ビットのネイティブ dll をロードできません。

これはいくつかの困難を説明する記事です

于 2011-03-23T21:02:48.947 に答える