在託管C# DLL 中嵌入非託管DLL
將非託管DLL 與託管C# 程式碼整合時,開發人員經常遇到需要將這些DLL 嵌入到託管C# DLL 中的情況。託管程序集。本文研究了潛在問題,並提供了將非託管 DLL 嵌入託管 DLL 的解決方案。
問題陳述
開發人員嘗試將非託管 DLL 嵌入託管 C# 中按照 Microsoft 的建議,使用 DllImport 屬性的 DLL。但是,在運行程式碼時,會拋出“訪問被拒絕”異常。
解決方案
雖然 MSDN 文件建議嵌入非託管 DLL 的可行性,但它失敗了解決與 DLL 存取權相關的根本問題。以下解決方案有效解決了此問題:
// 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);
以上是如何在託管 C# DLL 中嵌入非託管 DLL 並避免「存取被拒絕」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!