ホームページ > バックエンド開発 > C++ > アンマネージド DLL をマネージド C# DLL に埋め込み、「アクセスが拒否されました」を回避する方法

アンマネージド DLL をマネージド C# DLL に埋め込み、「アクセスが拒否されました」を回避する方法

DDD
リリース: 2024-12-29 14:32:11
オリジナル
867 人が閲覧しました

How to Embed Unmanaged DLLs in Managed C# DLLs and Avoid

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

アンマネージド DLL をマネージド C# コードと統合する場合、開発者は多くの場合、これらの DLL をマネージド C# DLL に埋め込む必要に遭遇します。管理されたアセンブリ。この記事では、潜在的な問題を調査し、アンマネージ DLL をマネージ DLL に埋め込むための解決策を提供します。

問題の説明

開発者がマネージド C# 内にアンマネージ DLL を埋め込もうとしています。 Microsoft の推奨に従って、DllImport 属性を使用する DLL。ただし、コードを実行すると、「アクセスが拒否されました」例外がスローされます。

解決策

MSDN ドキュメントでは、アンマネージ DLL の埋め込みの可能性が示唆されていますが、失敗します。 DLL のアクセス許可に関連する根本的な問題に対処します。次の解決策は、この問題に効果的に対処します:

  1. アンマネージ DLL を抽出します: 初期化中に、埋め込みリソースから一時ディレクトリにアンマネージ DLL を抽出します。
  2. DLL を明示的にロードします: 抽出後、LoadLibrary 関数を使用して DLL を明示的にロードします。
  3. DllImport を使用する: DLL がロードされると、それを参照する DllImport ディレクティブは、既にロードされたバージョンを利用します。

これは、次の実装例です。このアプローチ:

// Extract the unmanaged DLL
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");
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);
ログイン後にコピー

これらの手順に従うことで、開発者は成功することができます。アンマネージド DLL をマネージド C# DLL に埋め込み、「アクセスが拒否されました」例外を克服し、この統合手法の可能性を最大限に引き出します。

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

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