|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我想详细了解ASP整站代码与PSP整站代码有什么优缺点,那个更好,更安全,更用容易维护,和管理。。。程序假如想复用他人写的.NET程序但手上只要一个编译过的EXE,那末办法之一是用Reflection(反射)。上面是一些例子,初度上手的人能够参考。
先假定我们要复用的第三方使用程序EXE是由上面的代码编译成的:
usingSystem;
namespaceMyNamespace
{
publicclassMyApp
{
publicMyNestedObjectmyNestedObject=null;
publicclassMyNestedObject{
publicstringname;
}
publicenumFourSeasonsEnum{
spring,summer,autumn,winter
}
publicMyApp(){
}
publicMyApp(MyNamespace.MyFormform){
}
publicMyNestedObjectFoo1(FourSeasonsEnumseason){
returnthis.myNestedObject;
}
publicstringFoo2(){
return"";
}
staticvoidMain(){
}
}
publicclassMyForm
{
publicMyForm(){
}
}
}
以下是一些间接援用经常见的挪用怎样用Reflection来改写:
1.用不含参数的机关函数天生工具
间接援用时,代码是
MyNamespace.MyAppapp=newMyNamespace.MyApp();
用Reflection来挪用的话就必要这么写(记得usingSystem.Reflection)
Assemblyassem=Assembly.LoadFile(@"C:HomeWorkspaceMyNamespacemyapp.exe");
TypeMyAppType=assem.GetType("MyNamespace.MyApp");
ConstructorInfoMyAppType_Constructor=MyAppType.GetConstructor(newType[]{});
objectapp=MyAppType_Constructor.Invoke(newobject[]{});
2.用含参数的机关函数天生工具
间接援用时,代码是
MyNamespace.MyAppapp=newMyNamespace.MyApp(newMyNamespace.MyForm());
用Reflection来挪用的话就必要这么写
Assemblyassem=Assembly.LoadFile(@"C:HomeWorkspaceMyNamespacemyapp.exe");
TypeMyAppType=assem.GetType("MyNamespace.MyApp");
TypeMyFormType=assem.GetType("MyNamespace.MyForm");
ConstructorInfoMyAppType_Constructor=MyAppType.GetConstructor(newType[]{MyFormType});
ConstructorInfoMyFormType_Constructor=MyFormType.GetConstructor(newType[]{});
objectform=MyFormType_Constructor.Invoke(newobject[]{});
objectapp=MyAppType_Constructor.Invoke(newobject[]{form});
3.挪用工具的办法
间接援用时,代码是
MyNamespace.MyAppapp=newMyNamespace.MyApp();
stringstr=app.Foo2();
用Reflection来挪用的话就必要这么写
Assemblyassem=Assembly.LoadFile(@"C:HomeWorkspaceMyNamespacemyapp.exe");
TypeMyAppType=assem.GetType("MyNamespace.MyApp");
ConstructorInfoMyAppType_Constructor=MyAppType.GetConstructor(newType[]{});
objectapp=MyAppType_Constructor.Invoke(newobject[]{});
objectstr=MyAppType.GetMethod("Foo2").Invoke(app,newobject[]{});
4.Set/Get成员变量
间接援用时,代码是
MyNamespace.MyAppapp=newMyNamespace.MyApp();
MyNamespace.MyApp.MyNestedObjectobj=app.myNestedObject;
MyNamespace.MyApp.MyNestedObjectobj2=newMyNamespace.MyApp.MyNestedObject();
app.myNestedObject=obj2;
用Reflection来挪用的话就必要这么写(注重,这里的MyNestedObject类是nestedtype,名字要用"MyNamespace.MyApp+MyNestedObject"而不是"MyNamespace.MyApp.MyNestedObject")
Assemblyassem=Assembly.LoadFile(@"C:HomeWorkspaceMyNamespacemyapp.exe");
TypeMyAppType=assem.GetType("MyNamespace.MyApp");
ConstructorInfoMyAppType_Constructor=MyAppType.GetConstructor(newType[]{});
objectapp=MyAppType_Constructor.Invoke(newobject[]{});
TypeMyNestedObjectType=assem.GetType("MyNamespace.MyApp+MyNestedObject");
FieldInfoMyNestedObjField=MyAppType.GetField("myNestedObject");
objectobj=MyNestedObjField.GetValue(app);
ConstructorInfoMyNestedObjectType_Constructor=MyNestedObjectType.GetConstructor(newType[]{});
objectobj2=MyNestedObjectType_Constructor.Invoke(newobject[]{});
MyNestedObjField.SetValue(app,obj2);
5.利用列举范例
间接援用时,代码是
MyNamespace.MyAppapp=newMyNamespace.MyApp();
MyNamespace.MyApp.MyNestedObjectobj=app.Foo1(MyNamespace.MyApp.FourSeasonsEnum.spring);
用Reflection来挪用的话就必要这么写
Assemblyassem=Assembly.LoadFile(@"C:HomeWorkspaceMyNamespacemyapp.exe");
TypeMyAppType=assem.GetType("MyNamespace.MyApp");
ConstructorInfoMyAppType_Constructor=MyAppType.GetConstructor(newType[]{});
objectapp=MyAppType_Constructor.Invoke(newobject[]{});
TypeFourSeasonsEnumType=assem.GetType("MyNamespace.MyApp+FourSeasonsEnum");
ArrayFourSeasonsEnumValues=Enum.GetValues(FourSeasonsEnumType);
objectSpringValue=FourSeasonsEnumValues.GetValue(0);
objectresult=MyAppType.GetMethod("Foo1").Invoke(app,newobject[]{SpringValue});
---
最初,只需有大概,应当只管不必Reflection,由于比拟起间接挪用,Reflection的功能相称差。
</p>问题是他们究竟是喜欢他们是使用软件时,速度快还是速度慢好.(当然在3秒以内).无论是他们输入资料时,查找资料时,分析资料时. |
|