日期:2014-05-20  浏览次数:21134 次

MethodInfo.Invoke()方法的问题
大体是这样的,我在本程序里加载了一个Assembly,然后通过MethodInfo.Invoke()方法调用Assembly里的一个有参函数,因为Invoke的时候只能传一个object型数组作为被调用函数的参数,所以在那个函数里我得把它转换回我要用的数据类型。问题就在这里了,转换失败。。。
但不用MethodInfo.Invoke而直接调用却可以(目标方法在本程序集内,但我实现的程序不能这样工作)。。不知道为什么。高手赐教!!

部分代码如下:
private   void   func1()
{
Object[]   parms   =   new   object[]{MyStructure( "id ", "msg ")};
Assembly   ass   =   new   Assembly.LoadFrom( "本程序.exe ");
ass.GetType( "TestNameSpace.TestClass ",   true).GetMethod( "Test ").Invoke(null,   parms);
}

private   void   func2()
{
Object[]   parms   =   new   object[]{MyStructure( "id ", "msg ")};
Test(parms[0]);
}

......
public   static   void   Test(object   parm)
{
MyStructure   myStrct   =   (MyStructure)parm;←func1中这里报错,无法转换,func2正常
MyStructure   myStrct   =   new   MyStructure( "id ", "msg ");func1,func2中都正常
}

------解决方案--------------------
问题在这里:
Assembly ass = new Assembly.LoadFrom( "本程序.exe ");
添加程序集引用的时候,程序集已经有一个副本出现在你的应用程序目录下,这时候你在加载一份程序集(在AppDomain中已经存在了内容一样的程序集),这时候会出现两份内容一样,但是被标识为不同的副本存在。Assembly.LoadFrom(string assemblyFile);中的路径应该指向你的应用程序目录下的那个.exe,而不是原来那个文件的路径,这样同一个程序集就不会被加载2次。
还有,LoadFrom是静态方法,貌似应该这么写:
Assembly asm = Assembly.LoadFrom(@ "... ");
------解决方案--------------------
ass.GetType( "TestNameSpace.TestClass ", true).GetMethod( "Test ").Invoke(null, parms);
这里的parms是object[]类型的,但是你却用public static void Test(object parm)来接收,所以出错。
------解决方案--------------------
public static void Test(object parm)
{
MyStructure myStrct = (MyStructure)parm;←func1中这里报错,无法转换,func2正常

============
你调试的时候,自己看一下parm的类型即可。