0

我想访问附加了 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'。

4

3 回答 3

3

我已经能够自己解决了。

代码:

Assembly assembly = Assembly.LoadFrom("Uranium.exe");
Type type = assembly.GetType("Uranium.Util");
MethodInfo methodInfo = type.GetMethod("SendClient");

methodInfo.Invoke(null, new object[] { Packet.GetData() });
于 2013-08-29T08:00:22.763 回答
0

您首先需要找到包含该类型的程序集。此外,您需要将类名传递给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()});
    }
}
于 2013-08-28T09:01:25.783 回答
0

从我可以从您发布的代码中读取的内容中,您尝试调用 Uranium 类的函数 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

于 2013-08-28T09:02:53.970 回答