大体是这样的,我在本程序里加载了一个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中都正常
}

解决方案 »

  1.   

    问题在这里:
    Assembly ass = new Assembly.LoadFrom("本程序.exe");
    添加程序集引用的时候,程序集已经有一个副本出现在你的应用程序目录下,这时候你在加载一份程序集(在AppDomain中已经存在了内容一样的程序集),这时候会出现两份内容一样,但是被标识为不同的副本存在。Assembly.LoadFrom(string assemblyFile);中的路径应该指向你的应用程序目录下的那个.exe,而不是原来那个文件的路径,这样同一个程序集就不会被加载2次。
    还有,LoadFrom是静态方法,貌似应该这么写:
    Assembly asm = Assembly.LoadFrom(@"...");
      

  2.   

    ass.GetType("TestNameSpace.TestClass", true).GetMethod("Test").Invoke(null, parms);
    这里的parms是object[]类型的,但是你却用public static void Test(object parm)来接收,所以出错。
      

  3.   

    To: QuickGO  恩,Assembly.LoadFrom这里是我写错了,不好意思,这个代码是个测试,原来的代码是调用Assembly.LoadFrom加载的另外一个程序集,不是本身,但还是有无法转换的错误
    To: tjvictor  MethodInfo.Invoke方法的第二个参数MSDN里是这样说的 :
    调用的方法或构造函数的参数列表。这是一个对象数组,这些对象与要调用的方法或构造函数的参数具有相同的数量、顺序和类型。如果没有参数,则此应为空引用(Visual Basic 中为 Nothing)。 
       而且异常也没有在Test函数上抛出,而是在类型转换那里抛出的:_message "指定的转换无效。"
             感谢两位帮忙,我发现在转换的时候转换成.net的类型没问题,但我自定义的就不行了
       是不是跟序列化有关系??
      

  4.   

    public static void Test(object parm)
    {
    MyStructure myStrct = (MyStructure)parm;←func1中这里报错,无法转换,func2正常============
    你调试的时候,自己看一下parm的类型即可。
      

  5.   

    To:runrunrun 
         parm的类型为MyStructure,但是如果我在Test函数里无法访问MyStructure的数据成员,编译的时候会报错,说是object类型中无此成员,编译无法通过
               唉。无奈,不行我就用字符串数组的了。  -_-|||