3

私のプロジェクトには、アンマネージ ネイティブ C++ dll と C# アプリケーションがあります。DllImport を使用してアンマネージド DLL から関数をインポートしようとしていますが、DllNotFoundException が引き続き発生します。

DLL を呼び出すコードは次のとおりです。

using System.Runtime.InteropServices;
namespace TestApp
{
  public delegate void UpdateDelegate(string s);
  class Program
  {
    [DllImport("CGPUnmanagedLibrary.dll")]
    internal static extern int parse_raw_gsod_file( 
      [MarshalAs(UnmanagedType.LPStr)]                                               
      string filePath,
      int minTemp, 
      UpdateDelegate callBack);

    static void Main(string[] args)
    {
      UpdateDelegate myCallBack = new UpdateDelegate(Program.Report);
      string path = @"C:\Creative Solutions\Projects\Clyde's Garden Planner\Frost Data Database\GSOD Data\GSOD_RAW_DATA\1992\gsod_1992.txt";
      int result = parse_raw_gsod_file(path, 32, myCallBack);
      Console.Write("Parse completed with exit code: " + result.ToString());
      Console.ReadLine();
    } // end main function

    public static void Report(string msg)
    {
      Console.Write("Message is ");
      Console.WriteLine(msg);
    }

  } // End class
} // end namespace

DLL をアプリの出力ディレクトリにコピーしようとしましたが、まだ見つかりません。また、DLL プロジェクトを参照として追加しようとしましたが、追加できないというポップアップ ウィンドウが表示されます。アンマネージ DLL をマネージ アプリケーションに正しくリンクするにはどうすればよいですか?

更新- 完全なエラーは次のとおりです。

Unable to load DLL 'CGPUnmanagedLibrary': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

更新 2 - DLL がロードしようとしている .exe と同じディレクトリにあることは確かです。これは、読み込まれていない DLL に依存関係があると思わせます。DLL で基本的な C++ ライブラリ (文字列、数学、iostream など) のみを使用しています。ロードできなかったものとその理由は何ですか?

更新 3 - Dependency Walker でテスト済み 依存関係ウォーカーでアンマネージ C++ DLL をロードしても、エラーは表示されませんでした。また、依存関係ウォーカーで実行可能ファイルを開こうとしたところ、GPSVC.DLL と IESHIMS.DLL の 2 つの DLL の読み込みエラーが表示されました。コードで標準の C++ ライブラリしか使用していないため、意味がありません。マネージ C++/CLI DLL がアンマネージ DLL もロードしようとしているという事実と関係があると思います (いくつかの C++/CLI ラッパーを実装しようとしていました)。とにかく、それ以来、私は新しいVSソリューションを開始し、先に進みました. 私の答えを見てください。

4

4 に答える 4

4

おそらく問題は、ロードしようとしている DLL ではなく、その (連鎖した) 依存関係の 1 つです。depends.exe または同様のユーティリティを DLL で実行して、すべての依存関係が見つかるかどうかを確認します。「指定されたモジュールが見つかりませんでした」という誤解を招くメッセージは、古典的な迷惑になっています (FAQ の資料ではないにしても!): ほとんどの場合、DLL が見つからない依存関係の 1 つである場合、DLL が見つからないと考えるようになります。見つかっています。

于 2013-01-26T03:05:36.940 に答える
2

テストするには、*.dll がロードしようとしている .exe と同じディレクトリにある必要があります。この時点では、Visual Studio が自動的に実行することを信頼しないでください。ファイルを C:* *****\Debug\x86\bin\ または実行している構成に物理的にコピーします。疑わしい場合は、すべての bin フォルダーにコピーしてください。パスを見つけたら、プロジェクトのビルドを自動化してファイルを正しくコピーする方法を探し始めます。それでも解決しない場合は、system32 に入れます。確かにそこにあるはずです。ただし、これらのことを行ってもまだ見つからない場合。アンマネージ dll への依存関係も欠落している可能性があります。

于 2013-01-26T01:36:16.117 に答える
0

まず、皆さんの助けに感謝したいと思います。残念ながら、私はこの問題を解決しませんでした (私の主な質問の編集を参照してください)。その答えは、まったく新しい Visual Studio ソリューションを開始し、C# アプリと C++ dll という 2 つの新しいプロジェクトを作成することでした。2 つの主要な関数をマーシャリングしているだけなので、ラッパーの必要性をなくしました。

再度、感謝します。

于 2013-01-30T02:10:51.627 に答える
0

ユーザー arayq2 の回答は非常に理にかなっていて、私の問題もすぐに解決できました。

私の場合、ロードできなかった dll (DllNotFoundException) は、別の dll に依存しています。この dll (私のプロジェクトの一部ではありません) は、実際には特定の .h および .lib ファイルの新しいバージョンでコンパイルされました。これらの .h および .lib ファイルの古いバージョン (同じファイル名) は、ロードできない dll をコンパイルしたプロジェクトの一部でした。

これらの .h および .lib ファイルの新しいバージョンで dll プロジェクトを更新し、dll プロジェクトを再コンパイルした後、問題は解決しました。

arayq2さん、ありがとうございます!

于 2016-06-25T20:39:55.967 に答える