ホームページ >バックエンド開発 >C++ >アンマネージド DLL をマネージド C# DLL に埋め込むときに発生する「アクセスが拒否されました」エラーを解決するにはどうすればよいですか?

アンマネージド DLL をマネージド C# DLL に埋め込むときに発生する「アクセスが拒否されました」エラーを解決するにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-05 17:54:41633ブラウズ

How to Resolve

マネージド 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。