首頁 >後端開發 >C++ >如何在託管 C# DLL 中嵌入非託管 DLL 並避免「存取被拒絕」?

如何在託管 C# DLL 中嵌入非託管 DLL 並避免「存取被拒絕」?

DDD
DDD原創
2024-12-29 14:32:11877瀏覽

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

在託管C# DLL 中嵌入非託管DLL

將非託管DLL 與託管C# 程式碼整合時,開發人員經常遇到需要將這些DLL 嵌入到託管C# DLL 中的情況。託管程序集。本文研究了潛在問題,並提供了將非託管 DLL 嵌入託管 DLL 的解決方案。

問題陳述

開發人員嘗試將非託管 DLL 嵌入託管 C# 中按照 Microsoft 的建議,使用 DllImport 屬性的 DLL。但是,在運行程式碼時,會拋出“訪問被拒絕”異常。

解決方案

雖然 MSDN 文件建議嵌入非託管 DLL 的可行性,但它失敗了解決與 DLL 存取權相關的根本問題。以下解決方案有效解決了此問題:

  1. 提取非託管 DLL: 在初始化期間,將非託管 DLL 從嵌入式資源提取到臨時目錄。
  2. 明確載入DLL:解壓縮後,使用LoadLibrary函數將DLL明確載入DLL:
  3. 解壓縮後,使用LoadLibrary函數將DLL明確載入到
  4. 利用DllImport:
  5. DLL 後,請引用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,克服「存取被拒絕”異常並釋放此集成技術的全部潛力。

以上是如何在託管 C# DLL 中嵌入非託管 DLL 並避免「存取被拒絕」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn