从DLL获取程序的程序集

本文关键字:程序集 程序 获取 DLL | 更新日期: 2023-09-27 18:29:13

我想访问一个附加DLL的程序的函数。

在DLL中我尝试过:

Assembly assembly = Assembly.GetExecutingAssembly();
Type type = assembly.GetType("Uranium");
MethodInfo methodInfo = type.GetMethod("Util");
methodInfo.Invoke("SendClient", new object[] { Packet.GetData()});

但不起作用我得到一个空异常,但不说行。正在运行的程序被调用,命名空间为"Uranium",类为"Util",函数为"SendClient"。

从DLL获取程序的程序集

我已经能够自己解决它了。

代码:

Assembly assembly = Assembly.LoadFrom("Uranium.exe");
Type type = assembly.GetType("Uranium.Util");
MethodInfo methodInfo = type.GetMethod("SendClient");
methodInfo.Invoke(null, new object[] { Packet.GetData() });

从您发布的代码中可以看出,您试图调用类铀的函数Util。您将传递一个字符串作为类的实例。

这应该更像你想要做的:

Assembly assembly = Assembly.GetExecutingAssembly();
Type type = assembly.GetType("Util");
MethodInfo methodInfo = type.GetMethod("SendClient");
methodInfo.Invoke(Activator.CreateInstance(type), new object[] { Packet.GetData()});

如果SendClient是静态成员函数,则Activator.CreateInstance(type)可以用null代替。当然,您应该添加GetTypeGetMethod返回值不是null 的检查

您首先需要找到包含该类型的程序集。此外,您需要将类名传递给GetType(),而不是命名空间,将方法名传递给GetMethod(),而不是类名。

foreach (Assembly currentassembly in AppDomain.CurrentDomain.GetAssemblies()) 
{
    Type t = currentassembly.GetType("Util", false, true);
    if (t != null) 
    {
        MethodInfo methodInfo = type.GetMethod("SendClient");
        methodInfo.Invoke(Activator.CreateInstance(t),new object[] { Packet.GetData()});
    }
}