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

アンマネージド DLL をマネージド C# DLL に埋め込むときに発生する「アクセスが拒否されました」エラーを解決する方法

Patricia Arquette
リリース: 2024-12-30 08:11:09
オリジナル
810 人が閲覧しました

How to Resolve

マネージド C# DLL 内へのアンマネージド DLL の埋め込み

マネージド C# DLL 内へのアンマネージド DLL の埋め込みは、必要なリソースをバンドルし、依存関係の管理を軽減する便利な方法です。この質問は、DllImport 属性を使用してアンマネージ DLL を埋め込もうとしているときに発生した「アクセス拒否」例外に対処します。

提供される解決策には、初期化中にアンマネージ DLL を一時ディレクトリに抽出することが含まれます。この手順には、埋め込みリソース ストリームにアクセスし、DLL の内容を一時的な場所にコピーすることが含まれます。抽出された DLL は、P/Invoke 呼び出しを使用する前に、LoadLibrary を使用して明示的にロードされます。

// Extract and load the unmanaged DLL.
string dllPath = Path.Combine(Path.GetTempPath(), "MyAssembly." +
  Assembly.GetExecutingAssembly().GetName().Version.ToString(), "MyAssembly.Unmanaged.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);
    }
  }
}

IntPtr h = LoadLibrary(dllPath);
Debug.Assert(h != IntPtr.Zero, "Unable to load library " + dllPath);
ログイン後にコピー

アンマネージ DLL がロードされると、マネージ DLL 内の DllImport 呼び出しで使用できるようになります。このアプローチにより、バージョンの異なる複数のアプリケーションが同時に実行されている場合でも、アンマネージ DLL の正しいバージョンが使用されることが保証されます。

以上がアンマネージド DLL をマネージド C# DLL に埋め込むときに発生する「アクセスが拒否されました」エラーを解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート