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
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
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内写的,也要引用吗?怎么解决?
无语,
不过也确实分不怎么多了。
看来还是用这句了。也没有人回,哎!
但是,很明显以下两种情况是不一样的:
Type t = objProtocol.GetType(); //从实体中获取该实体的类型
Type t = Type.GetType( "CrystalProtocol.Protocol.Flux.XinJiShuWL1A" ); //从名称空间中获取指定类的类型一个是实体的类型,一个是名称空间中指定的类型
这句话,肯定不行啊,Type.GetType是不行滴
看解释如下:如果类型对象引用的程序集不存在,则此示例引发一个异常。
所以只能是assem.GetType
这句话,肯定不行啊,Type.GetType是不行滴你的Assembly是动态加载的嘛
所以只能是assem.GetType是的,是动态加载的,我已经意识到这个问题了,
也就是说Type.GetType是不能取到动态加载的程序集的类型的。
不管是已经把要加载的程序集已经引用了,还是怎么处理,都不行。所以动态加载的程序集中的类型,只能通过
Type t1 = assem.GetType("CrystalProtocol.Protocol.Flux.XinJiShuWL1A");
来取得。