Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Membenamkan DLL Tidak Terurus dalam DLL C# Terurus dan Elakkan 'Akses Ditolak'?

Bagaimana untuk Membenamkan DLL Tidak Terurus dalam DLL C# Terurus dan Elakkan 'Akses Ditolak'?

DDD
Lepaskan: 2024-12-29 14:32:11
asal
877 orang telah melayarinya

How to Embed Unmanaged DLLs in Managed C# DLLs and Avoid

Membenamkan DLL Tidak Terurus dalam DLL C# Terurus

Apabila menyepadukan DLL tidak terurus dengan kod C# terurus, pembangun sering menghadapi keperluan untuk membenamkan DLL ini dalam perhimpunan terurus. Artikel ini menyiasat isu yang berpotensi dan menyediakan penyelesaian untuk membenamkan DLL tidak terurus ke dalam DLL terurus.

Pernyataan Masalah

Pemaju cuba membenamkan DLL tidak terurus dalam C# terurus DLL menggunakan atribut DllImport, seperti yang disyorkan oleh Microsoft. Walau bagaimanapun, selepas menjalankan kod, pengecualian "Akses dinafikan" dilemparkan.

Penyelesaian

Walaupun dokumentasi MSDN mencadangkan kemungkinan membenamkan DLL yang tidak terurus, ia gagal untuk menangani isu asas yang berkaitan dengan kebenaran akses DLL. Penyelesaian berikut berkesan menangani masalah ini:

  1. Ekstrak DLL Tidak Terurus: Semasa permulaan, ekstrak DLL tidak terurus daripada sumber terbenam ke direktori sementara.
  2. Muat DLL Secara Eksplisit: Selepas pengekstrakan, gunakan fungsi LoadLibrary untuk memuatkan DLL secara eksplisit ke dalam proses.
  3. Gunakan DllImport: Sebaik sahaja DLL dimuatkan, arahan DllImport yang merujuknya akan menggunakan versi yang telah dimuatkan.

Inilah contoh pelaksanaan ini pendekatan:

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

Dengan mengikuti langkah ini, pembangun boleh berjaya membenamkan DLL tidak terurus ke dalam DLL C# terurus, mengatasi pengecualian "Akses dinafikan" dan membuka kunci potensi penuh teknik penyepaduan ini.

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

sumber:php.cn
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