热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

在Framework4.0中:找出新增的方法与新增的类(二)

为什么动态加载程序集无法找出Framework4.0和Framwork2.0新增的方法和类
问题描述:在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:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll");
    Assembly assemblyV4 = Assembly.LoadFile(
                        @"C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll");
    Console.WriteLine("V2的名称{0}\nV4的名称{1}", assemblyV2.FullName, assemblyV4.FullName);
    Console.ReadLine();
}

输出如下:

image 

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

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

代码结构如下:

image

V4NewLooker是基于framework 2.0Winform程序

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文件绑定代码如下:
代码如下:


   
     
       
     

     
       
     

   

   
              name="V4WcfService.Service1">
                  cOntract="V4WcfService.IService1">
         
           
         

       

                  cOntract="IMetadataExchange" />
     

   

   
     
       
         
         
         
         
       

     

   

 


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

WinForm程序界面如下:

image 

后台代码如下:

代码如下:

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服务。服务就会根据传递过来的TypeMemberInfo来输出新增的方法和类。

运行效果如下:

image 

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


推荐阅读
  • windows便签快捷键_用了windows十几年,没想到竟然这么好用!隐藏的功能你知道吗?
    本文介绍了使用windows操作系统时的一些隐藏功能,包括便签快捷键、截图功能等。同时探讨了windows和macOS操作系统之间的优劣比较,以及人们对于这两个系统的不同看法。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 如何在联想win10专业版中修改账户名称
    本文介绍了在联想win10专业版中修改账户名称的方法,包括在计算机管理中找到要修改的账户,通过重命名来修改登录名和属性来修改显示名称。同时指出了windows10家庭版无法使用此方法的限制。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 电脑公司win7剪切板位置及使用方法
    本文介绍了电脑公司win7剪切板的位置和使用方法。剪切板一般位于c:\windows\system32目录,程序名为clipbrd.exe。通过在搜索栏中输入cmd打开命令提示符窗口,并输入clip /?即可调用剪贴板查看器。赶紧来试试看吧!更多精彩文章请关注本站。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • win10系统搭建Java开发环境的操作方法
    本文介绍了win10系统搭建Java开发环境的详细操作方法,包括下载Windows10系统和Java SE,安装Java开发环境,设置变量等步骤。操作简单,只需按照指导进行即可。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 【Windows】实现微信双开或多开的方法及步骤详解
    本文介绍了在Windows系统下实现微信双开或多开的方法,通过安装微信电脑版、复制微信程序启动路径、修改文本文件为bat文件等步骤,实现同时登录两个或多个微信的效果。相比于使用虚拟机的方法,本方法更简单易行,适用于任何电脑,并且不会消耗过多系统资源。详细步骤和原理解释请参考本文内容。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
author-avatar
倩倩倩倩倩倩雯-
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有