问题描述:在Framework4.0中:找出新增的方法与新增的类(一)
为什么动态加载程序集无法找出Framework4.0和Framwork2.0新增的方法和类?
因为控制台程序默认就添加了Framework4.0的程序集,当你使用Object,Type,string这些类的时候就已经在使用已经加载的程序集了,而clr不会重复的去加载程序集??,这点记不清了。
所以V2Assembly和v4Assembly都是Framework4.0的Assembly。
验证:
代码如下:
staticvoidMain(string[]args)
{
AssemblyassemblyV2=Assembly.LoadFile(
@”C:WINDOWSMicrosoft.NETFrameworkv2.0.50727mscorlib.dll”);
AssemblyassemblyV4=Assembly.LoadFile(
@”C:WINDOWSMicrosoft.NETFrameworkv4.0.30319mscorlib.dll”);
Console.WriteLine(“V2的名称{0}nV4的名称{1}”,assemblyV2.FullName,assemblyV4.FullName);
Console.ReadLine();
}
输出如下:
因为mscorlib.dll是在ShareDomain中的程序集,所以在同一应用程序中无法加载两个不同的mscorlib.dll.所以考虑使用两个应用程序,一个Framework2.0,另一个Framework4.0。
于是可以换个思路:使用2.0的framework来创建的程序来调用framework4.0的WCF服务。
代码结构如下:
V4NewLooker是基于framework2.0的Winform程序
V4WcfService是基于framework4.0的WCF服务。
接口的定义如下:
代码如下:
namespaceV4WcfService
{
//注意:使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。
[ServiceContract]
publicinterfaceIService1
{
[OperationContract]
List<TypeMembers>GetNewTypeMember(List<TypeMembers>lstOldTypes);
}
[DataContract]
publicclassTypeMembers
{
[DataMember]
publicstringFullName{get;set;}
[DataMember]
publicList<string>MemberNames{get;set;}
}
}
服务实现代码如下:
代码如下:
namespaceV4WcfService
{
//注意:使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc和配置文件中的类名“Service1”。
publicclassService1:IService1
{
publicList<TypeMembers>GetNewTypeMember(List<TypeMembers>lstOldTypes)
{
List<TypeMembers>result=newList<TypeMembers>();
AssemblymscorlibAssembly=typeof(object).Assembly;
Type[]v4Types=mscorlibAssembly.GetTypes();
#region所有更新的Type
foreach(TypeMembersv3TypeinlstOldTypes)
{
Typev4Type=v4Types.FirstOrDefault(t=>t.FullName==v3Type.FullName);
if(v4Type!=null&&!v4Type.IsEnum)
{
MemberInfo[]v4Mis=v4Type.GetMembers();
if(v4Mis.Length!=v3Type.MemberNames.Count)
{
MemberInfo[]v4NewMis=v4Mis.Where(mi=>
!v3Type.MemberNames.Contains(mi.Name)).ToArray();
result.Add(newTypeMembers()
{
FullName=v4Type.FullName,
MemberNames=v4NewMis.Select(mi=>mi.Name).ToList()
});
}
}
}
#endregion
#region所有新增的Type
List<string>v3TypeFullName=lstOldTypes.Select(tm=>tm.FullName).ToList();
Type[]v4NewTypes=v4Types.Where(t=>!v3TypeFullName.Contains(t.FullName)&&
!t.IsEnum).ToArray();
foreach(Typev4NewTypeinv4NewTypes)
{
result.Add(newTypeMembers()
{
FullName=v4NewType.FullName,
MemberNames=v4NewType.GetMembers().Select(mi=>mi.Name).ToList()
});
}
#endregion
returnresult.OrderBy(tm=>tm.FullName).ToList();
}
}
}
服务的实现和第一个反射的版本差不多。
Web.config文件绑定代码如下:
代码如下:
<system.serviceModel>
<bindings>
<wsHttpBinding>
<bindingname=”NewBinding0″maxReceivedMessageSize=”65536000″/>
</wsHttpBinding>
<mexHttpBinding>
<bindingname=”NewBinding1″/>
</mexHttpBinding>
</bindings>
<services>
<servicebehaviorConfiguration=”V4WcfService.Service1Behavior”
name=”V4WcfService.Service1″>
<endpointaddress=””binding=”wsHttpBinding”bindingConfiguration=”NewBinding0″
contract=”V4WcfService.IService1″>
<identity>
<dnsvalue=”localhost”/>
</identity>
</endpoint>
<endpointaddress=”mex”binding=”mexHttpBinding”bindingConfiguration=”NewBinding1″
contract=”IMetadataExchange”/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behaviorname=”V4WcfService.Service1Behavior”>
<!–为避免泄漏元数据信息,请在部署前将以下值设置为false并删除上面的元数据终结点–>
<serviceMetadatahttpGetEnabled=”true”/>
<!–要接收故障异常详细信息以进行调试,请将以下值设置为true。在部署前 置为false以避免泄漏异常信息–>
<serviceDebugincludeExceptionDetailInFaults=”false”/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
因为默认的maxReceivedMessageSize为65536,所以在后面增加了两个0,否则会抛出经典的超出范围的异常。
WinForm程序界面如下:
后台代码如下:
代码如下:
namespaceV4NewLooker
{
publicpartialclassForm1:Form
{
publicForm1()
{
InitializeComponent();
}
privateList<TypeMembers>NewTypeMembers{get;set;}
privatevoidbtnSearch_Click(objectsender,EventArgse)
{
AssemblymscorlibAssembly=typeof(object).Assembly;
List<TypeMembers>v3TypeMembers=newList<TypeMembers>();
foreach(Typev4NewTypeinmscorlibAssembly.GetTypes())
{
List<string>memberNames=newList<string>();
MemberInfo[]mis=v4NewType.GetMembers();
foreach(MemberInfomiinmis)
{
memberNames.Add(mi.Name);
}
v3TypeMembers.Add(newTypeMembers()
{
FullName=v4NewType.FullName,
MemberNames=memberNames
});
}
using(Service1Clientclient=newService1Client())
{
NewTypeMembers=client.GetNewTypeMember(v3TypeMembers);
}
List<string>typeNames=newList<string>();
foreach(TypeMemberstminNewTypeMembers)
{
typeNames.Add(tm.FullName);
}
lstBox_Types.DataSource=typeNames;
}
privatevoidlstBox_Types_SelectedIndexChanged(objectsender,EventArgse)
{
stringfullName=lstBox_Types.SelectedItem.ToString();
foreach(TypeMemberstminNewTypeMembers)
{
&nb sp;if(tm.FullName==fullName)
{
lstBox_Members.DataSource=tm.MemberNames;
break;
}
}
}
}
}
搜索按钮的功能就是把当前Framework2.0的所有的Type,所有的Type中的MemberInfo封装成请求,然后调用WCF服务。服务就会根据传递过来的Type和MemberInfo来输出新增的方法和类。
运行效果如下:
可以看到4.0的File类增加了ReadLines.AppendAllLines方法。上面看到两个ReadLines是因为ReadLines方法由两个重载。
C++中关于[]静态数组和new分配的动态数组的区别分析
C++对数组的引用实例分析
上述就是C#学习教程:在Framework 4.0中:找出新增的方法与新增的类(二)分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/904697.html