Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mengakses Kaedah Dalam DLL yang Dimuatkan Secara Dinamik dalam Aplikasi Konsol C#?

Bagaimanakah Saya Boleh Mengakses Kaedah Dalam DLL yang Dimuatkan Secara Dinamik dalam Aplikasi Konsol C#?

Barbara Streisand
Barbara Streisandasal
2025-01-14 10:44:51585semak imbas

How Can I Access Methods Within a Dynamically Loaded DLL in a C# Console Application?

Pemuatan dinamik DLL dalam C#

C# membenarkan DLL dimuatkan dan digunakan secara dinamik pada masa jalan. Kaedah Assembly.LoadFile() membenarkan memuatkan DLL ke dalam aplikasi.

Masalah: Tidak dapat menggunakan kaedah daripada DLL yang dimuatkan dalam aplikasi konsol

Pengguna melaporkan boleh memuatkan DLL tetapi tidak dapat mengakses kaedahnya. Ini kerana pengkompil C# tidak boleh pra-menyelesaikan jenis dan ahli dalam DLL. Untuk memanggil kaedah dalam DLL, anda perlu menggunakan pantulan atau objek dinamik.

Penyelesaian 1: Gunakan Refleksi

Refleksi membolehkan mendapatkan jenis metadata dan memanggil ahlinya pada masa jalan. Menggunakan refleksi memerlukan secara eksplisit memanggil kaedah:

<code class="language-csharp">// 加载 DLL
var assembly = Assembly.LoadFile(@"C:\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\DLL.dll");

// 遍历 DLL 中导出的类型
foreach (Type type in assembly.GetExportedTypes())
{
    // 创建类型实例
    var instance = Activator.CreateInstance(type);

    // 调用方法 (假设方法名为 "Output" 并接受一个字符串参数)
    type.InvokeMember("Output", BindingFlags.InvokeMethod, null, instance, new object[] { "Hello" });
}</code>

Penyelesaian 2: Gunakan objek dinamik (.NET 4.0 dan ke atas)

Objek dinamik membenarkan panggilan kaedah DLL dalam kod tanpa penukaran jenis eksplisit dan dengan sintaks yang lebih mudah:

<code class="language-csharp">// 加载 DLL
var assembly = Assembly.LoadFile(@"C:\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\DLL.dll");

// 遍历 DLL 中导出的类型
foreach (Type type in assembly.GetExportedTypes())
{
    // 创建动态实例
    dynamic instance = Activator.CreateInstance(type);

    // 调用方法 (假设方法名为 "Output" 并接受一个字符串参数)
    instance.Output("Hello");
}</code>

Kedua-dua penyelesaian menunjukkan cara mengakses kaedah secara dinamik dalam DLL. Kaedah yang anda pilih bergantung pada versi .NET dan pilihan peribadi anda. Refleksi menyediakan kawalan yang lebih halus, manakala objek dinamik memudahkan kod. Ambil perhatian bahawa @"C:visual studio 2012ProjectsConsoleApplication1ConsoleApplication1DLL.dll" perlu diganti dengan laluan sebenar ke DLL anda.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengakses Kaedah Dalam DLL yang Dimuatkan Secara Dinamik dalam Aplikasi Konsol C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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