我想访问附加了DLL的程序的函数。
在DLL中我尝试过:
Assembly assembly = Assembly.GetExecutingAssembly();
Type type = assembly.GetType("Uranium");
MethodInfo methodInfo = type.GetMethod("Util");
methodInfo.Invoke("SendClient", new object[] { Packet.GetData()});
但不行,我得到一个null异常,但不说该行。 调用正在运行的程序,名称空间为'Uranium',类为'Util',函数为'SendClient'。
答案 0 :(得分: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() });
答案 1 :(得分: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()});
}
}
答案 2 :(得分: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
。
当然,您应该添加GetType
和GetMethod
返回值不是null
的检查