マネージド C# DLL にアンマネージ DLL を埋め込む方法
背景
アンマネージ DLL をマネージド C# DLL に埋め込むマネージド C# DLL は、シームレスな.NET プロジェクト内でのネイティブ コードの使用。 Microsoft は、次の説明に従ってこの機能をサポートしています:
http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.dllimportattribute.aspx
エラー: アクセスが拒否されました(0x80070005)
推奨されるアプローチに従っているにもかかわらず、ユーザーは次の例外に遭遇する可能性があります:
アクセスが拒否されました。 (HRESULT からの例外: 0x80070005
(E_ACCESSDENIED))
解決策: DLL を明示的に抽出してロードします
この問題を解決するには、アンマネージ DLL は一時ディレクトリに抽出し、P/Invoke を使用する前に LoadLibrary を使用して明示的にロードする必要があります。この手法により、リソースが適切にアクセスされ、依存関係が正しく確立されることが保証されます。
コード サンプル
次のコードは、このアプローチを示しています。
// Create a temporary directory string dirName = Path.Combine(Path.GetTempPath(), "MyAssembly." + Assembly.GetExecutingAssembly().GetName().Version.ToString()); if (!Directory.Exists(dirName)) Directory.CreateDirectory(dirName); string dllPath = Path.Combine(dirName, "MyAssembly.Unmanaged.dll"); // Extract the embedded DLL using (Stream stm = Assembly.GetExecutingAssembly().GetManifestResourceStream( "MyAssembly.Properties.MyAssembly.Unmanaged.dll")) { using (Stream outFile = File.Create(dllPath)) { const int sz = 4096; byte[] buf = new byte[sz]; while (true) { int nRead = stm.Read(buf, 0, sz); if (nRead < 1) break; outFile.Write(buf, 0, nRead); } } } // Load the DLL explicitly IntPtr h = LoadLibrary(dllPath); Debug.Assert(h != IntPtr.Zero, "Unable to load library " + dllPath);
このアプローチに従うことで、開発者はマネージド C# DLL 内にアンマネージ DLL を埋め込み、P/Invoke 呼び出しを問題なく利用できるようになります。アクセス拒否エラーが発生しました。
以上がアンマネージド DLL をマネージド C# DLL に埋め込むときに発生する「アクセスが拒否されました」エラーを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。