2013-08-28 57 views
-1

我想访问从中附加了DLL的程序的函数。从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'。

+0

你得到任何异常? – Ehsan

+0

由于您可能想要使用附加的DLL,因此您需要使用GetAssembly(),而不是GetExecutingAssembly。 – Botis

回答

2

我已经能够解决它在我自己的。

代码:

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

methodInfo.Invoke(null, new object[] { Packet.GetData() }); 
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()}); 
    } 
} 
+0

他已经声明该类位于正在执行的Assemply中。无需循环。 – fredrik

+0

没有装配包含'Util'类。但它确实包含。 – Trewqa

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

+0

显示类型为空。 – Trewqa

+0

该课程是公开的吗?如果是私人班,你可能根本看不到它。 – fredrik

+0

是的,是公开的。命名空间Uranium {public class Util {}} – Trewqa