仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 475|回复: 8
打印 上一主题 下一主题

[学习教程] ASP教程之用反射挪用他人的.NET程序里的类和办法...

[复制链接]
莫相离 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:48:17 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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秒以内).无论是他们输入资料时,查找资料时,分析资料时.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-29 05:57

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表