5

dllアプリケーション (C# フレームワーク 4.0 で記述) からアンマネージ コードを使用しようとすると、いくつかの問題が発生します。私は次のようにdllインポートを使用しています

[DllImport(@"C:\MGW_SDK.dll", EntryPoint = "fInicializaSDK")]
public static extern int fInicializaSDK();

奇妙なことに、開発環境 (Windows XP) から呼び出すと問題なく動作しますが、運用サーバー (Windows7) では次の例外が生成されます。

System.DllNotFoundException: DLL をロードできません' C:\MGW_SDK.dll': 指定されたモジュールが見つかりませんでした。(HRESULT からの例外: 0x8007007E) Comtpaq.AdminPack.SDKWrapper.fInicializaSDK() at Comtpaq.AdminPack.AdminPaqRepository.InitializeSDK()in C:\Work\AgroIn\AdminPaqRepository.cs:line 30

私はすでにDependency Walkerを実行しました。これは、次の依存関係が競合していることを示しています。C:\windows\system32\SHLWAPI.DLL

dll私はすでにそれを展開ディレクトリにコピーしようとしました

MGW_SDK.dllオンです(c:\パスが示すように)

C ランタイム ライブラリを既にインストールしています

また、いくつかの興味深い点にも気付きました。例外として、開発パスが表示されていますC:\Work\AgroIn\AdminPaqRepository.cs:line 30

ここで他に何が問題になる可能性がありますか?

編集

extern私が使用する/dllimportメソッドの1つだけを使用して小さなコンソールアプリケーションを構築し、MGW_SDK.dll問題なく(まったくDllNotFoundException)実行したため、これは構築中のアプリケーション(WCFサービス)に関連しているようです。このサービスは WAS でホストされていますが、まだ問題が見つかりません。

4

4 に答える 4

6

うーん、これは非常に難しい問題でした。dll の依存関係や dll の場所とは関係ありませんでした。それは私がどのように電話していたかについてではありませんでしたDllImport。権限の問題でした。

基本的に、この問題は、dll があるフォルダーで実行するためのアクセス許可を取り出して追加し直すことで解決されます。こちらの記事(ウェイバックマシン)をご覧ください。

解決


Oracle 9.2 クライアント ソフトウェアでは、次の手順に従って、認証済みユーザー権限を Oracle ホームに付与する必要があります。

  1. 管理者権限を持つユーザーとして Windows にログオンします。

  2. [スタート] メニューから Windows エクスプローラーを起動し、ORACLE_HOMEフォルダーに移動します。これは通常、"Oracle" フォルダの下の "Ora92" フォルダです (つまりD:\Oracle\Ora92)。

  3. ORACLE_HOME フォルダを右クリックし、ドロップダウン リストから [プロパティ] オプションを選択します。[プロパティ] ウィンドウが表示されます。

  4. 「プロパティ」ウィンドウの「セキュリティ」タブをクリックします。

  5. 「名前」リストの「認証済みユーザー」項目をクリックします (Windows XP では、「名前」リストは「グループまたはユーザー名」と呼ばれます)。

  6. [許可] 列の下の [アクセス許可] リストで [読み取りと実行] ボックスのチェックを外します (Windows XP では、[アクセス許可] リストは [認証されたユーザーのアクセス許可] と呼ばれます)。

  7. [許可] 列の下にある [読み取りと実行] ボックスを再度オンにします (これは、先ほどオフにしたボックスです)。

  8. 「詳細設定」ボタンをクリックし、「アクセス許可エントリ」リストに「認証済みユーザー」が表示されていることを確認します。

      Permission = Read & Execute 
      Apply To = This folder, subfolders and files 
    

    そうでない場合は、その行を編集し、[適用先] ドロップダウン ボックスが [このフォルダー、サブフォルダー、およびファイル] に設定されていることを確認します。これはすでに適切に設定されているはずですが、これを確認することが重要です。

  9. すべてのセキュリティ プロパティ ウィンドウを閉じるまで、[OK] ボタンをクリックします。変更したばかりのアクセス許可をすべてのサブフォルダーとファイルに適用するため、カーソルが数秒間砂時計を表示する場合があります。

  10. コンピューターを再起動して、これらの変更が有効になっていることを確認します (重要)。

アプリケーションを再実行すると、動作するはずです。

于 2010-10-07T08:52:06.560 に答える
2

Cのルートは、UACが記述できない場所の1つです。保護された領域からの読み取りを要求するマニフェストされていないアプリが、仮想化された同等の領域から読み取ることになり、DLLがそこにない場合があります。DLLを別のフォルダ(Cのルートではなく、プログラムファイルの下には何もありません)に移動してみて、それで解決するかどうかを確認してください。その場合は、そのままにしておくか、(より適切に)アプリにマニフェストを配置して仮想化を防ぐことができます。

于 2010-09-29T12:04:27.083 に答える
1

これが確実に機能するかどうかはわかりませんが、Win7ボックスでregsrv32または他のインストールパッケージを使用してMGW_SDK.DLLを登録してみましたか?

また、MGW_SDK.DLLの依存関係がWin7マシンでも利用できるかどうかを確認してください(システムに登録されているか、アプリケーションフォルダーに登録されているかは機能します)

于 2010-09-29T04:56:27.090 に答える
1

Assembly Binding Log Viewerを試してみましたか?

アセンブリ バインド ログ ビューアー

于 2010-09-29T04:25:48.877 に答える