如何在托管 C# DLL 中嵌入非托管 DLL
背景
在其中嵌入非托管 DLL托管 C# DLL 是一种允许无缝使用本机.NET 项目中的代码。 Microsoft 支持此功能,如下所述:
http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.dllimportattribute.aspx
错误:访问被拒绝(0x80070005)
尽管遵循推荐的方法,用户可能会遇到以下异常:
访问被拒绝。 (HRESULT 异常:0x80070005
(E_ACCESSDENIED))
解决方案:显式提取并加载 DLL
为了解决这个问题,非托管DLL在使用 P/Invoke 之前,应将其提取到临时目录并使用 LoadLibrary 显式加载。此技术可确保正确访问资源并正确建立依赖关系。
代码示例
以下代码演示了此方法:
// Create a temporary directory 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 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 中,并成功利用 P/Invoke 调用,而不会遇到访问被拒绝的情况错误。
以上是在托管 C# DLL 中嵌入非托管 DLL 时如何解决'访问被拒绝”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!