Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menyelesaikan Ralat 'Akses Ditolak' Apabila Membenamkan DLL Tidak Terurus dalam DLL C# Terurus?

Bagaimana untuk Menyelesaikan Ralat 'Akses Ditolak' Apabila Membenamkan DLL Tidak Terurus dalam DLL C# Terurus?

DDD
Lepaskan: 2025-01-05 17:54:41
asal
678 orang telah melayarinya

How to Resolve

Cara Membenamkan DLL Tidak Terurus dalam DLL C# Terurus

Latar Belakang

Membenamkan DLL tidak terurus dalam DLL C# terurus ialah teknik yang membolehkan penggunaan kod asli yang lancar dalam projek .NET. Microsoft menyokong ciri ini, seperti yang digariskan di sini:

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.dllimportattribute.aspx

Ralat: Akses Ditolak (0x80070005)

Walaupun mengikut pendekatan yang disyorkan, pengguna mungkin menghadapi pengecualian berikut:


Akses dinafikan. (Pengecualian daripada HRESULT: 0x80070005
(E_ACCESSDENIED))


Penyelesaian: Ekstrak dan Muatkan DLL Secara Eksplisit

Untuk menyelesaikan masalah ini, pihak DLL yang tidak diurus harus diekstrak ke direktori sementara dan dimuatkan secara eksplisit menggunakan LoadLibrary sebelum menggunakan P/Invoke. Teknik ini memastikan sumber diakses dengan betul dan kebergantungan diwujudkan dengan betul.

Sampel Kod

Kod berikut menunjukkan pendekatan ini:

// 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);
Salin selepas log masuk

Dengan mengikuti pendekatan ini, pembangun boleh membenamkan DLL tidak terurus dalam DLL C# terurus dan berjaya menggunakan panggilan P/Invoke tanpa menghadapi ralat akses dinafikan.

Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Ralat 'Akses Ditolak' Apabila Membenamkan DLL Tidak Terurus dalam DLL C# Terurus?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan