私の.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);
助言がありますか?
私がWindows上で覚えているものからdllの検索順序は以下のとおりです。
C:\windows\system32 or c:\windows\SysWOW64
(64ビットボックス上の32ビットプロセス用)。Path
環境変数からの読み取りさらに、私はDLLの依存関係をチェックしたい、Visual Studioで提供されている依存関係ウォーカーはここであなたを助けることができる、それはまた無料でダウンロードされることができる: http://www.dependencywalker.com
Dumpbinツールを使って、必要なDLL依存関係を見つけることができます。
dumpbin /DEPENDENTS my.dll
これにより、DLLを読み込む必要があるDLLがわかります。特にMSVCR * .dllを探してください。正しいVisual C++再頒布可能パッケージがインストールされていない場合にエラーコードが発生するのを見ました。
Microsoft Webサイトから「Visual Studio 2013用のVisual C++再頒布可能パッケージ」を入手できます。それは、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のデバッグビルドは、Visual Studioと一緒にインストールされ、再頒布可能パッケージによってはインストールされない、ライブラリのデバッグバージョンであるMSVCR120d.dllに依存します。
DLLのフルパスを入力してみてください。うまくいかない場合は、dllをsystem32フォルダにコピーしてみてください。
DLLはbinフォルダになければなりません。
Visual Studioで、私は私のプロジェクトにdllを追加します(Referencesにはありませんが、 "Add existing file")。次に、dllの[出力ディレクトリにコピー]プロパティを[新しい場合はコピー]に設定します。
これは 'kludge'ですしかしあなたは少なくとも妥当性テストにそれを使うことができます:あなたのコードの中のDLLへのパスをハードコーディングしてみてください
[DllImport(@"C:\\mycompany\\MyDLL.dll")]
そうは言っても;私の場合は、@ anthony-haywardが示唆しているようにdumpbin /DEPENDENTS
を実行し、そこにリストされている2ビットバージョンのDLLを作業ディレクトリにコピーすることで、この問題は解決しました。
それがロードできないのは「私の」dllではないのでメッセージはちょっと誤解を招くようなものです - それは依存関係です
自分のdllのすべての依存関係がdllの近く、またはSystem32
に存在することを確認してください。
あなたの時間を無駄にするかもしれない1つの非常に面白いことがあり(そして技術的な関連性があります)、ここでそれを共有することを考えています -
コンソールアプリケーションプロジェクトConsoleApplication1
とクラスライブラリプロジェクトClassLibrary1
を作成しました。
P/invokeを作っていたすべてのコードはClassLibrary1.dll
にありました。そのため、Visual Studioからアプリケーションをデバッグする前に、CLRによって実行時にロードできるように、C++アンマネージドアセンブリ(myUnmanagedFunctions.dll
)を\bin\debug\
プロジェクトのClassLibrary1
ディレクトリに単純にコピーしました。
続けて
DLLを読み込めません
時間エラーその後、ロードされる管理されていないアセンブリはすべて、通常はWinフォーム、コンソール、またはWebアプリケーションであるスタートアッププロジェクト\bin\debug
のConsoleApplication1
ディレクトリにコピーする必要があることに気付きました。
そのため、受け入れられた回答のCurrent Directory
は、実際には、アプリケーションプロセスが開始された場所からメインの実行可能ファイルのCurrent Directory
を意味することに注意してください。当たり前のことのように見えますが、時にはそうではないかもしれません。
Lesson Learned - アンマネージDLLを必ず起動可能な実行可能ファイルと同じディレクトリに配置して、確実に見つけられるようにします。
フュージョンロギングを有効にします。どうしたらよいかについての多くのアドバイスは この質問 を参照してください。問題をロードしている混在モードアプリのデバッグは、非常に困難な作業です。フュージョンロギングは大きな助けになります。
アプリケーションをテスト用のPCにデプロイしたときにも同じ問題がありました。問題は開発用PCにmsvcp110d.dll
とmsvcr110d.dll
がありましたが、テスト用PCにはなかったことです。
InstalledSheildに "Visual Studio C++ 11.0 DebugCRT(x86)"マージモジュールを追加して動作しました。これが他の人に役立つことを願います。
DLLと.NETプロジェクトが同じソリューションにあり、その両方を毎回コンパイルして実行する場合は、.NETプロジェクトのプロパティであるBuild eventsを右クリックし、次のようなものを追加できます。ビルド後のイベントのコマンドラインに続く:
copy $(SolutionDir)Debug\MyOwn.dll .
これは基本的にDOSの行なので、DLLのビルド先に基づいて微調整できます。
32ビットプラットフォーム用にコンパイルされている可能性があるDLLと互換性があるように、Build Platform Targetをx86またはx64に設定してください。
私の場合、1つの管理されていないdllが欠けていた他のものに依存していました。その場合、エラーは、紛らわしいものではなく既存のdllを指すことになり、本当に混乱を招く可能性があります。
それがまさに私の場合に起こったことです。これが他の人に役立つことを願っています。
セットアップ:32ビットWindows 7
コンテキスト:前述の問題のために通信できなかったPCI-GPIBドライバをインストールしました。
簡単な回答:ドライバを再インストールしてください。
長い回答:私は Dependency Walker も使っていましたが、足りない依存モジュールがいくつか見つかりました。すぐに、私はそれが不完全なドライバのインストールであったに違いないと思いました。不足している各ファイルをチェックして復元したくありませんでした。
私はコントロールパネルのプログラムと機能の下にアンインストーラを見つけることができなかったという事実は悪いインストールのもう一つの指標です。ドライバの再インストールを可能にするために、\ system32内の* .dllとレジストリキーを手動で削除する必要がありました。
問題が修正されました。
予期しない部分は、すべての依存関係モジュールが解決されたわけではないということでした。それにもかかわらず、関心のある* .dllを今すぐ参照することができます。
私は同じ問題に遭遇しました、私の場合私は2つの32ビットPCを持っていました。 .NET4.5がインストールされているものと新しいPCがありました。
私の32ビットcpp dll(リリースモードビルド)は、.NETがインストールされたPCでは問題なく動作していましたが、以下のエラーが発生した新鮮なPCでは動作しませんでした。
DLL 'PrinterSettings.dll'を読み込めません:指定されたモジュールが見つかりませんでした。 (HRESULTからの例外:0x8007007E)
最後に、
プロジェクトをデバッグモード設定でビルドしたところで、今回はcpp dllが正常に動作していました。
管理されていないc/c ++ dllファイルをc#環境で使用した場合も同じ問題に直面しました。
1.Dllと32bitまたは64bit CPUとの互換性を確認しました。
2. DLL .binフォルダ、system32/sysWOW64、または指定されたパスの正しいパスを確認しました。
PDB(Program Database)ファイルが欠けているかどうか3.Checked。これ ビデオ あなたに最高のpdbファイルについてのansを与える。
64ビットシステムで32ビットC/C++バイナリコードを実行している場合、プラットフォームの非互換性のためにこれが発生する可能性があります。ビルド>構成マネージャから変更できます。