Assembly assem = Assembly.LoadFile(@"E:\工作\公司项目文档\透明协议组件\a4.软件实现\CrystalProtocol组件\bin\Debug\CrystalProtocol.dll"); 
Type myProtocolType = assem.GetType("CrystalProtocol.Protocol.Flux.XinJiShuWL1A"); 
ConstructorInfo myProtocolType_Constructor = myProtocolType.GetConstructor( new Type[]{Type.GetType("System.String")} );
object objProtocolContent = ( object ) "00;00;30;35;6d;33;30;64;31;35;3a;31;38;27;20;51;3d;32;37;2e;37;37;4c;2f;53;20;4d;3d;30;31;30;37;37;38;39;35;20;00;00;00;00;00;00;30;37;42;39;0d;" ;
object objProtocol = myProtocolType_Constructor.Invoke( new object[]{ objProtocolContent} ) ;
// Type t = objProtocol.GetType() ;
Type t = Type.GetType( "CrystalProtocol.Protocol.Flux.XinJiShuWL1A" ) ; 
Console.WriteLine( t.ToString() ) ; // 输出都是 CrystalProtocol.Protocol.Flux.XinJiShuWL1A
MethodInfo mi = t.GetMethod("parse");
mi.Invoke( objProtocol, null );
上面的代码中
情况一:
//Type t = objProtocol.GetType() ;
情况二:
输出都是 CrystalProtocol.Protocol.Flux.XinJiShuWL1A
//Console.WriteLine( t.ToString() ) ; 但是为什么
情况一:正确执行,
情况二:报错,是什么原因?
System.Reflection.TargetException: 对象与目标类型不匹配。
   at System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess)
   at System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean verifyAccess)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
   at CrystalProtocol.Test.Nunit.TestDataAccess() in e:\工作\公司项目文档\透明协议组件\a4.软件实现\crystalprotocol组件\test\nunit.cs:line 206

解决方案 »

  1.   

    代码改动一下,这样看清晰一点Assembly assem = Assembly.LoadFile(@"E:\工作\公司项目文档\透明协议组件\a4.软件实现\CrystalProtocol组件\bin\Debug\CrystalProtocol.dll"); 
    Type t1 = assem.GetType("CrystalProtocol.Protocol.Flux.XinJiShuWL1A"); 
    ConstructorInfo myProtocolType_Constructor = t1.GetConstructor( new Type[]{Type.GetType("System.String")} );
    object objProtocolContent = ( object ) "00;00;30;35;6d;33;30;64;31;35;3a;31;38;27;20;51;3d;32;37;2e;37;37;4c;2f;53;20;4d;3d;30;31;30;37;37;38;39;35;20;00;00;00;00;00;00;30;37;42;39;0d;" ;
    object objProtocol = myProtocolType_Constructor.Invoke( new object[]{ objProtocolContent} ) ;
    Type t2 = objProtocol.GetType() ;
    Type t3 = Type.GetType("CrystalProtocol.Protocol.Flux.XinJiShuWL1A"); 
    Console.WriteLine( t1.ToString() ) ; // 输出都是 CrystalProtocol.Protocol.Flux.XinJiShuWL1A
    Console.WriteLine( t2.ToString() ) ; // 输出都是 CrystalProtocol.Protocol.Flux.XinJiShuWL1A
    // MethodInfo mi = t1.GetMethod("parse");
    // MethodInfo mi = t2.GetMethod("parse");
    MethodInfo mi = t3.GetMethod("parse");
    mi.Invoke( objProtocol, null );上面的t1\t2\t3都是类型,但是MethodInfo mi = t3.GetMethod("parse");的时候有问题,后来分析了一下,是因为Type t3 = Type.GetType("CrystalProtocol.Protocol.Flux.XinJiShuWL1A"); 这句,因为系统type中不包括CrystalProtocol.Protocol.Flux.XinJiShuWL1A类型,是因为没有引用吗?我是在assembly内写的,也要引用吗?怎么解决?
      

  2.   

    to 9sun888(九个太阳) ( )
    无语,
    不过也确实分不怎么多了。
      

  3.   

    区别已经知道了,现在的问题变成:后来分析了一下,是因为Type t3 = Type.GetType("CrystalProtocol.Protocol.Flux.XinJiShuWL1A"); 这句,因为系统type中不包括CrystalProtocol.Protocol.Flux.XinJiShuWL1A类型,是因为没有引用吗?我是在assembly内写的,也要引用吗?怎么解决?
      

  4.   

    Type t1 = assem.GetType("CrystalProtocol.Protocol.Flux.XinJiShuWL1A"); 
    看来还是用这句了。也没有人回,哎!
      

  5.   

    不是很明白你想说明什么问题!
    但是,很明显以下两种情况是不一样的:
    Type t = objProtocol.GetType(); //从实体中获取该实体的类型
    Type t = Type.GetType( "CrystalProtocol.Protocol.Flux.XinJiShuWL1A" ); //从名称空间中获取指定类的类型一个是实体的类型,一个是名称空间中指定的类型
      

  6.   

    你的Type t3 = Type.GetType("CrystalProtocol.Protocol.Flux.XinJiShuWL1A"); 
    这句话,肯定不行啊,Type.GetType是不行滴
    看解释如下:如果类型对象引用的程序集不存在,则此示例引发一个异常。
      

  7.   

    你的Assembly是动态加载的嘛
    所以只能是assem.GetType
      

  8.   

    你的Type t3 = Type.GetType("CrystalProtocol.Protocol.Flux.XinJiShuWL1A"); 
    这句话,肯定不行啊,Type.GetType是不行滴你的Assembly是动态加载的嘛
    所以只能是assem.GetType是的,是动态加载的,我已经意识到这个问题了,
    也就是说Type.GetType是不能取到动态加载的程序集的类型的。
    不管是已经把要加载的程序集已经引用了,还是怎么处理,都不行。所以动态加载的程序集中的类型,只能通过
    Type t1 = assem.GetType("CrystalProtocol.Protocol.Flux.XinJiShuWL1A"); 
    来取得。