私のプロジェクトには、アンマネージ ネイティブ 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ソリューションを開始し、先に進みました. 私の答えを見てください。