当前位置:编程学习 > asp >>

找出Framework 4.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.0的framework来创建的程序来调用framework4.0的WCF服务。

 

 

代码结构如下:

image

V4NewLooker是基于framework 2.0的Winform程序

V4WcfService是基于framework 4.0 的WCF服务。

 

 

 

 

接口的定义如下:


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

[DataContract]
public class TypeMembers
{
[DataMember]
public string FullName { get; set; }

[DataMember]
public List<string> MemberNames { get; set; }
}
}

 

服务实现代码如下:

 


namespace V4WcfService
{
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“Service1”。
public class Service1 : IService1
{
public List<TypeMembers> GetNewTypeMember(List<TypeMembers> lstOldTypes)
{
List<TypeMembers> result = new List<TypeMembers>();

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

 


<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="NewBinding0" maxReceivedMessageSize="65536000" />
</wsHttpBinding>
<mex
补充:Web开发 , ASP.Net ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,