Csharp/C#教程:在Framework 4.0中:找出新增的方法与新增的类(二)分享

问题描述:在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();
}

输出如下:

在Framework 4.0中:找出新增的方法与新增的类(二) 

因为mscorlib.dll是在ShareDomain中的程序集,所以在同一应用程序中无法加载两个不同的mscorlib.dll.所以考虑使用两个应用程序,一个Framework2.0,另一个Framework4.0。

于是可以换个思路:使用2.0的framework来创建的程序来调用framework4.0的WCF服务。

代码结构如下:

在Framework 4.0中:找出新增的方法与新增的类(二)

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程序界面如下:

在Framework 4.0中:找出新增的方法与新增的类(二) 

后台代码如下:
代码如下:
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来输出新增的方法和类。

运行效果如下:

在Framework 4.0中:找出新增的方法与新增的类(二) 

可以看到4.0的File类增加了ReadLines.AppendAllLines方法。上面看到两个ReadLines是因为ReadLines方法由两个重载。

标签: ram work 方法

C++中关于[]静态数组和new分配的动态数组的区别分析

C++对数组的引用实例分析

上述就是C#学习教程:在Framework 4.0中:找出新增的方法与新增的类(二)分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/904697.html

(0)
上一篇 2021年10月22日
下一篇 2021年10月22日

精彩推荐