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

如何在託管 C# DLL 中嵌入非託管 DLL?

Susan Sarandon
發布: 2024-12-31 21:43:10
原創
984 人瀏覽過

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

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

問題:

如何將非託管C DLL 嵌入到C DLL託管中C# DLL 使用DLLImport?

答案:

雖然通常不建議將非託管DLL 嵌入到託管DLL 中,但可以透過在初始化期間將非託管DLL 提取到臨時目錄來實現使用前使用LoadLibrary 明確載入它P/Invoke。

實作:

  1. 提取非託管DLL:確定一個臨時目錄來儲存非託管DLL,使用程式集的版本號以避免版本衝突。將包含 DLL 的嵌入資源流提取到此目錄。
  2. 載入 DLL:使用 LoadLibrary 明確載入擷取的 DLL。臨時目錄可能不在系統路徑中,因此這是 P/Invoke 指令定位 DLL 所必需的。

範例程式碼:

// Get temporary directory with assembly version in path
string dirName = Path.Combine(Path.GetTempPath(), "MyAssembly." + Assembly.GetExecutingAssembly().GetName().Version);
Directory.CreateDirectory(dirName);
string dllPath = Path.Combine(dirName, "MyAssembly.Unmanaged.dll");

// Get embedded resource stream and copy DLL to temporary file
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 DLL explicitly
IntPtr h = LoadLibrary(dllPath);
Debug.Assert(h != IntPtr.Zero, "Unable to load library " + dllPath);
登入後複製

請注意,這種方法有其優點,例如將所有內容都保存在單一檔案中,但通常建議將非託管DLL 作為單獨的檔案連結到組件既安全又簡單。

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

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