首頁 > 後端開發 > C++ > 如何在託管 C# DLL 中成功嵌入和使用非託管 DLL?

如何在託管 C# DLL 中成功嵌入和使用非託管 DLL?

Patricia Arquette
發布: 2024-12-29 07:44:09
原創
367 人瀏覽過

How Can I Successfully Embed and Use an Unmanaged DLL within a Managed C# DLL?

將非託管DLL 嵌入到託管C# DLL 中

將非託管DLL 嵌入到託管DLL 中是一種鞏固和保護依賴項的有用技術。但是,實現起來可能具有挑戰性。

問題:

嘗試使用 DllImport 將非託管 DLL 嵌入到託管 DLL 中時,會遇到存取被拒絕的情況錯誤。

說明:

要將非託管DLL 嵌入為資源,除了簡單地將其添加為專案中的嵌入資源之外,您還需要執行其他步驟。

解決方案:

成功嵌入並在託管DLL 中使用非託管DLL:

  1. 提取並提取並載入嵌入式DLL:

    • 從嵌入式中提取非託管 DLL資源流到臨時目錄。
    • 使用 LoadLibrary 明確載入擷取的 DLL在使用 DllImport 之前。
  2. 使用唯一的臨時目錄:

    • 為您的每個版本建立一個唯一的臨時目錄彙編以避免版本
  3. 處理檔案複製異常:

    • 嘗試將嵌入的DLL 複製到暫存目錄時處理異常。如果目錄中已存在該文件,您可以忽略該異常。

範例程式碼:

以下程式碼片段示範了嵌入過程:

// Get a unique temporary directory for this assembly version
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 to the temporary location
using (Stream stm = Assembly.GetExecutingAssembly().GetManifestResourceStream(
  "MyAssembly.Properties.MyAssembly.Unmanaged.dll"))
{
  using (Stream outFile = File.Create(dllPath))
  {
    CopyBytes(stm, outFile);
  }
}

// Load the extracted DLL explicitly
IntPtr h = LoadLibrary(dllPath);
Debug.Assert(h != IntPtr.Zero, "Unable to load library " + dllPath);
登入後複製

以上是如何在託管 C# DLL 中成功嵌入和使用非託管 DLL?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板