当前位置:  编程技术>.net/c#/asp.net

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

    来源: 互联网  发布时间:2014-10-20

    本文导语:  问题描述:在Framework 4.0中:找出新增的方法与新增的类(一)为什么动态加载程序集无法找出Framework 4.0 和Framwork2.0 新增的方法和类? 因为控制台程序默认就添加了Framework4.0的程序集,当你使用Object,Type,string这些类的时候就已...

问题描述:在Framework 4.0中:找出新增的方法与新增的类(一)

为什么动态加载程序集无法找出Framework 4.0 和Framwork2.0 新增的方法和类?
 
因为控制台程序默认就添加了Framework4.0的程序集,当你使用Object,Type,string这些类的时候就已经在使用已经加载的程序集了,而clr不会重复的去加载程序集??,这点记不清了。
所以V2Assembly 和v4Assembly都是Framework4.0的Assembly。

验证:
代码如下:

static void Main(string[] args)
{
    Assembly assemblyV2 = Assembly.LoadFile(
                        @"C:WINDOWSMicrosoft.NETFrameworkv2.0.50727mscorlib.dll");
    Assembly assemblyV4 = Assembly.LoadFile(
                        @"C:WINDOWSMicrosoft.NETFrameworkv4.0.30319mscorlib.dll");
    Console.WriteLine("V2的名称{0}nV4的名称{1}", assemblyV2.FullName, assemblyV4.FullName);
    Console.ReadLine();
}

输出如下:

 

因为mscorlib.dll 是在Share Domain中的程序集,所以在同一应用程序中无法加载两个不同的mscorlib.dll.所以考虑使用两个应用程序,一个Framework 2.0,另一个Framework 4.0。

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

代码结构如下:

V4NewLooker是基于framework 2.0的Winform程序

V4WcfService是基于framework 4.0 的WCF服务。

接口的定义如下:

代码如下:

namespace V4WcfService
{
    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        List GetNewTypeMember(List lstOldTypes);
    }
    [DataContract]
    public class TypeMembers
    {
        [DataMember]
        public string FullName { get; set; }
        [DataMember]
        public List MemberNames { get; set; }
    }
}

服务实现代码如下:
代码如下:

namespace V4WcfService
{
    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“Service1”。
    public class Service1 : IService1
    {
        public List GetNewTypeMember(List lstOldTypes)
        {
            List result = new List();
            Assembly mscorlibAssembly = typeof(object).Assembly;
            Type[] v4Types = mscorlibAssembly.GetTypes();
            #region 所有更新的Type
            foreach (TypeMembers v3Type in lstOldTypes)
            {
                Type v4Type = 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(new TypeMembers()
                        {
                            FullName = v4Type.FullName,
                            MemberNames = v4NewMis.Select(mi => mi.Name).ToList()
                        });
                    }
                }
            }
            #endregion
            #region 所有新增的Type
            List v3TypeFullName = lstOldTypes.Select(tm => tm.FullName).ToList();
Type[] v4NewTypes = v4Types.Where(t => !v3TypeFullName.Contains(t.FullName) &&
!t.IsEnum).ToArray();
            foreach (Type v4NewType in v4NewTypes)
            {
                result.Add(new TypeMembers()
                {
                    FullName = v4NewType.FullName,
                    MemberNames = v4NewType.GetMembers().Select(mi => mi.Name).ToList()
                });
            }
            #endregion
            return result.OrderBy(tm=>tm.FullName).ToList();
        }
    }
}

服务的实现和第一个反射的版本差不多。

Web.config文件绑定代码如下:
代码如下:


   
     
       
     
     
       
     
   
   
     
       
         
           
         
       
       
     
   
   
     
       
         
         
         
         
       
     
   
 

因为默认的maxReceivedMessageSize 为65536,所以在后面增加了两个0, 否则会抛出经典的超出范围的异常。

WinForm程序界面如下:

 

后台代码如下:

代码如下:

namespace V4NewLooker
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private List NewTypeMembers { get; set; }
        private void btnSearch_Click(object sender, EventArgs e)
        {
            Assembly mscorlibAssembly = typeof(object).Assembly;
            List v3TypeMembers = new List();
            foreach (Type v4NewType in mscorlibAssembly.GetTypes())
            {
                List memberNames = new List();
                MemberInfo[] mis = v4NewType.GetMembers();
                foreach (MemberInfo mi in mis)
                {
                    memberNames.Add(mi.Name);
                }
                v3TypeMembers.Add(new TypeMembers()
                {
                    FullName = v4NewType.FullName,
                    MemberNames = memberNames
                });
            }
            using (Service1Client client = new Service1Client())
            {
                NewTypeMembers = client.GetNewTypeMember(v3TypeMembers);
            }
            List typeNames=new List();
            foreach (TypeMembers tm in NewTypeMembers)
            {
                typeNames.Add(tm.FullName);
            }
            lstBox_Types.DataSource = typeNames;
        }
        private void lstBox_Types_SelectedIndexChanged(object sender, EventArgs e)
        {
            string fullName = lstBox_Types.SelectedItem.ToString();
            foreach (TypeMembers tm in NewTypeMembers)
            {
                if (tm.FullName == fullName)
                {
                    lstBox_Members.DataSource = tm.MemberNames;
                    break;
                }
            }
        }
    }
}

搜索按钮的功能就是把当前Framework 2.0的所有的Type,所有的Type中的MemberInfo封装成请求,然后调用WCF服务。服务就会根据传递过来的Type和MemberInfo来输出新增的方法和类。

运行效果如下:

 

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


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Javamail要JavaBeans Activation Framework 的支持,是什么意思?是不是也要下载JavaBeans Activation Framework?他是不是也是一个包?是不
  • android framework
  • The V C++ GUI Framework
  • Zend Framework Models Generator
  • Intel App Framework
  • 在Linux下可以装.NET Framework吗?
  • PHP的Web开发框架 epesi framework
  • G-Framework ToolKit
  • Ajax toolkit framework
  • UI 框架 Startup framework
  • YAML CSS framework
  • Web Tracing Framework
  • MOEA Framework
  • Eclipse Modeling Framework
  • Java批量作业框架 Java Batch Job Framework
  • 企业级应用框架 Moqui Framework
  • NIO 网络框架 NIO Framework
  • 自动化测试平台 Robot Framework
  • Ajax 框架 Spry framework for Ajax
  • Zend Framework


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3