DLLをロードできません(モジュールが見つかりませんHRESULT:0x8007007E)


113

.NET 4.0アプリケーションで使用する必要があるアンマネージC ++ APIコードを含むDLLライブラリがあります。しかし、私が自分のdllをロードしようとすると、エラーが発生します。

DLL 'MyOwn.dll'を読み込めません:指定されたモジュールが見つかりませんでした。(HRESULTからの例外:0x8007007E)

私はインターネットで見つけたseveraソリューションを読んで試しました。何も動作しません。

次の方法を試してみました:

[DllImport("MyOwn.dll",  CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs((UnmanagedType.I4))]
public static extern Int32 MyProIni(string DBname, string DBuser_pass,
    string WorkDirectory, ref StringBuilder ErrorMessage);

この記事を試してみてこの例を(ダウンロードしたコードから)実行すると、問題なく実行されます(使用されているdllはbin / debugフォルダーにあります)

私は自分のdllを(binフォルダーに依存するすべてのファイルとともに)コピーしました。

私もこのアプローチを試しましたが、同じエラーが発生しました:

[DllImportAttribute(MyOwnLibDllPath, EntryPoint="TMproIni")]
[return: MarshalAs(UnmanagedType.I4)]
public static extern  int MyproIni(string DBname, string DBuser_pass, 
    string WorkDirectory, ref StringBuilder ErrorMessage);

助言がありますか?

回答:


90

私がWindowsで覚えていることから、dllの検索順序は次のとおりです。

  1. カレントディレクトリ
  2. システムフォルダーC:\windows\system32 or c:\windows\SysWOW64(64ビットボックスの32ビットプロセス用)。
  3. Path環境変数からの読み取り

さらに、DLLの依存関係を確認します。VisualStudioで提供される依存関係ウォーカーは、ここで役立ちます無料でダウンロードすることもできます。http//www.dependencywalker.com


4
一部の依存関係の欠落が見つかりました(OracleとIEの一部のDLL)。私のDLLは、私が知っているだろうthat..thenに依存するためのOracleをインストールする必要があります:) DependencyWalkerに問題が見つかりました;)
Ingimar Andresson

心配はいりません。頭を掻く時間を大幅に節約できました。すばらしい小さなツールです。:-)
display101

1
DependencyWalkerを提案するためのキースハリガンへの+1。すべての依存関係が同じCPUタイプ(x86 / x64)を持っているわけではないことがわかりました。同じCPUタイプのすべてのファイルをアプリケーションのbinフォルダーにコピーして、問題を解決しました。
DiligentKarma 2013年

6
私のシステムで見つけることができるすべてのdllには、異なるCPUタイプでエラーがあると主張するDependencyWalkerがあります-System.Web.Mvc.dllですら。ここにある種の誤警報があります。
PandaWood 2013

2
私の場合、問題はデバッグ用にコンパイルされたC ++ DLLをロードしようとしたことです。これには、C ++デバッグランタイムが必要です。つまり、Visual Studioをインストールする必要があります。または、リリース用のDLLを再コンパイルして、配布可能なC ++ランタイムをインストールします。
RenniePet 14

42

dumpbinツールを使用して、必要なDLL依存関係を見つけることができます。

dumpbin /DEPENDENTS my.dll

これにより、DLLがロードする必要のあるDLLがわかります。特にMSVCR * .dllに注意してください。正しいVisual C ++再頒布可能パッケージがインストールされていない場合にエラーコードが発生することを確認しました。

「Visual Studio 2013のVisual C ++再頒布可能パッケージ」は、MicrosoftのWebサイトから入手できます。c:\ windows \ system32 \ MSVCR120.dllをインストールします

ファイル名は、120 = 12.0 = Visual Studio 2013です。

DLLのターゲットプラットフォームに適切なVisual Studioバージョン(10.0 = VS 10、11 = VS 2012、12.0 = VS 2013 ...)の正しいアーキテクチャ(x64またはx86)を使用していること、および注意する必要があることに注意してください。ビルドをデバッグします。DLLのデバッグビルドは、ライブラリのデバッグバージョンであるMSVCR120d.dllに依存しています。これは、Visual Studioと共にインストールされますが、再頒布可能パッケージではインストールされません。


5
VS C ++再頒布可能パッケージを追加するのはそれだけでした!v10.0(2010)が必要です。どうもありがとうございます!!!
チアゴ・シウバ

再頒布可能ファイルの64ビットまたは32ビットバージョンが必要かどうかを確認する方法はありますか?
BVB 2015年

1
dumpbin / ALLは、my.dllがx64のx86かどうかを通知します
Anthony Hayward

1
まだこの問題に苦しんでいる人にとって、debugバイナリを使用する場合、C ++ランタイム再配布可能ファイルのバージョンは、ビルドした場所とまったく同じである必要があります。
skyline75489 2016

@ skyline75489のコメントで一日が節約できました。C ++ライブラリは私のマシンでは問題なく機能しましたが、VSがそれをmsvcrのデバッグバージョンにリンクしているため、他の場所ではロードできませんでした。
スパイ

14

これは、「その場しのぎ」ですが、あなたは少なくとも健全性テストにそれを使用することができます:あなたのコード内のDLLへのパスをハードコーディングしてください

[DllImport(@"C:\\mycompany\\MyDLL.dll")]

そうは言っても; 私の場合dumpbin /DEPENDENTS、@ anthony-haywardの提案どおりに実行され、そこにリストされているDLLの32ビットバージョンを作業ディレクトリにコピーすると、この問題が解決しました。

ロードできないのは「my」dllではないため、メッセージは少し誤解を招くだけです-依存関係です


12

DLLはbinフォルダーにある必要があります。

Visual Studioで、dllをプロジェクトに追加します(「参照」ではなく「既存のファイルを追加」)。次に、dllの「出力ディレクトリにコピー」プロパティを「新しい場合はコピー」に設定します。


11

DLLのフルパスを入力してみてください。動作しない場合は、dllをsystem32フォルダーにコピーしてください。


3
すべての依存関係をSystem32フォルダーと私のDLLのどこかに配置しても問題ありませんか?
Ingimar Andresson、2012

依存関係は、stackoverflow.com


4

あなたの時間を浪費するかもしれない非常に面白いことが1つあり(そして技術的に関連があります)、それをここで共有することを考えました-

コンソールアプリケーションプロジェクトConsoleApplication1とクラスライブラリプロジェクトを作成しましたClassLibrary1

p / invokeを作成していたすべてのコードがに存在していましたClassLibrary1.dll。したがって、Visual Studioからアプリケーションをデバッグする前に、C ++のアンマネージアセンブリ(myUnmanagedFunctions.dll)をプロジェクトの\bin\debug\ディレクトリにコピーClassLibrary1して、CLRによって実行時にロードできるようにしました。

私は得続けた

DLLをロードできません

時間のエラー。後で、読み込まれるこのようなアンマネージアセンブリはすべて、通常はwinフォーム、コンソール、またはWebアプリケーション\bin\debugである起動プロジェクトのディレクトリにコピーする必要があることに気付きましたConsoleApplication1

したがってCurrent Directory、受け入れられた回答の中で、実際にCurrent Directoryアプリケーションプロセスが開始されるところからメインの実行可能ファイルを意味することに注意してください。当たり前のように見えますが、そうでない場合もあります。

学んだ教訓 -管理されていないdllは、必ず起動実行可能ファイルと同じディレクトリに置いて、確実に見つけられるようにしてください。


これは私にとっても修正されました。ただし、DLLを実際に使用しているプロジェクトではなくメインプロジェクトに配置するのはちょっと変だと感じます...
Sean Duggan

@SeanDugganは、「動的リンクライブラリ」であるため、リンク時に使用される静的ライブラリとは対照的に、実行時に使用(ロード)されるためです。
m4l490n

私はにDLLを追加しようとしているbin\Debugと、obj\Debugディレクトリと、私は「DLLを読み込むことができません」得続ける
m4l490n

3

フュージョンロギングをオンにします。その方法に関する多くのアドバイスについては、この質問を参照してください。混合モードのアプリの読み込みの問題をデバッグすることは、まさに王の苦痛です。フュージョンロギングは大きな助けになります。


2

32ビットプラットフォーム用にコンパイルされるDLLと互換性があるように、ビルドプラットフォームターゲットをx86またはx64に設定してください。


2

DLLと.NETプロジェクトが同じソリューションにあり、両方を毎回コンパイルして実行する場合は、.NETプロジェクトのプロパティを右クリックして、ビルドイベントを作成し、次のようなものをポストビルドイベントに追加します。コマンドライン:

copy $(SolutionDir)Debug\MyOwn.dll .

これは基本的にDOS行であり、DLLのビルド先に基づいて調整できます。


2

アプリケーションをPCをテストするために展開したときにも同じ問題が発生しました。問題は、開発用PCにはmsvcp110d.dllありましたmsvcr110d.dllが、テスト用PCにはありませんでした。

InstalledSheildに "Visual Studio C ++ 11.0 DebugCRT(x86)"マージモジュールを追加し、動作しました。これが他の誰かに役立つことを願っています。


2

私の場合、1つのアンマネージDLLが欠落していた別のDLLに依存していました。その場合、エラーは欠落しているDLLではなく既存のDLLを指すため、本当に混乱する可能性があります。

それがまさに私の場合に起こったことです。これが他の誰かを助けることを願っています。


1

管理されていないライブラリにはマニフェストが必要だと思います。
ここではあなたのバイナリに追加する方法です。そしてここに理由があります。

要約すると、いくつかの再頒布可能ライブラリバージョンをボックスにインストールできますが、そのうちの1つだけがアプリを満たす必要があり、それがデフォルトではない可能性があるため、ライブラリに必要なバージョンをシステムに通知する必要があります。これが、マニフェストの理由です。


1

セットアップ:32ビットWindows 7

コンテキスト:前述の問題のために通信できないPCI-GPIBドライバーをインストールしました。

短い答え:ドライバを再インストールします。

長い回答:いくつかの欠落している依存関係モジュールを特定するDependency Walkerも使用しました。すぐに、それはおかしなドライバーのインストールだったに違いないと思いました。欠落している各ファイルをチェックして復元したくありませんでした。

コントロールパネルの[プログラムと機能]でアンインストーラーを見つけることができなかったという事実は、不適切なインストールのもう1つの指標です。ドライバーの再インストールを可能にするために、\ system32のいくつかの* .dllとレジストリキーを手動で削除する必要がありました。

問題が修正されました。

予期しない部分は、すべての依存関係モジュールが解決されなかったことです。それでも、対象の* .dllを参照できるようになりました。


1

私は同じ問題に遭遇しました、私の場合、私は2つの32ビットPCを持っていました。.NET4.5がインストールされているものと、新しいPCです。

私の32ビットcpp dll(リリースモードビルド)は、.NETがインストールされたPCでは正常に動作していましたが、以下のエラーが発生した新しいPCでは動作しません

DLL 'PrinterSettings.dll'を読み込めません:指定されたモジュールが見つかりませんでした。(HRESULTからの例外:0x8007007E)

最後に、

プロジェクトをデバッグモード構成でビルドしたところ、今回はcpp dllが正常に機能していました。


0

また、c#環境でアンマネージドc / c ++ dllファイルを使用すると、同じ問題に直面しました。

1. DLLと32ビットまたは64ビットCPUとの互換性を確認しました。

2. DLL .binフォルダーの正しいパスsystem32 / sysWOW64、または指定されたパスを確認しました。

3.PDB(Programme Database)ファイルが欠落していないか確認しました。このビデオでは、pdbファイルについて理解するのに最適です。

64ビットシステムで32ビットC / C ++バイナリコードを実行すると、プラットフォームの非互換性のためにこれが発生する可能性があります。[ビルド]> [構成マネージャー]から変更できます。


0

.Net Framework +4にC ++ Dllをインポートするときに同じ問題に直面しました。プロジェクト->プロパティ->ビルド-> 32ビットを優先するのチェックを外すと解決しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.