Fraamewark 4.0において、新規の方法と新規のクラスを探し出す(二)
7255 ワード
問題の説明:Fraameweork 4.0において、新規の方法と新規のクラスを探し出す(一)はどうしてダイナミックローディングプログラムセットがFrame ebook 4.0とFrame work 2.0の新たに追加された方法とクラスを探し出せないのですか? コンソールプログラムはデフォルトでFraameweork 4.0のプログラムセットを追加しましたので、Object、Type、stringなどを使う時はすでにロードされたプログラムセットを使っていますが、clrはプログラムセットを繰り返しません。この点はよく覚えていません。したがって、V 2 Asssembleとv 4 Asssembleは共にFrambook 4.0のAsembleである。認証:
mscorlib.dllはShare Domainにおけるプログラム集であるため、同じアプリケーションでは2つの異なるmscorlib.dllをロードできないので、2つのアプリケーション、一つのFramwark 2.0、もう一つのFramwork 4.0を使用することを考慮します。
これにより、2.0のフレームワークを使用して作成されたプログラムは、frame ebook 4.0のWCFサービスを呼び出すことができます。
コード構造は以下の通りです。
V 4 NewLookはフレームワーク2.0に基づくWinformプログラムです。
V 4 WcfServiceは、frame ewark 4.0に基づくWCFサービスである。
インタフェースの定義は以下の通りである。
WinFormプログラムの画面は以下の通りです。
バックグラウンドコードは以下の通りです。
運転効果は以下の通りです。
4.0のFile類はReadLiness.ApppendAllLiners方法を追加したと見られます。上に二つのReadlinesが見られたのは、Readlines方法が二つの重さによって運ばれるからです。
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}
V4 {1}", assemblyV2.FullName, assemblyV4.FullName);
Console.ReadLine();
}
出力は以下の通りです。mscorlib.dllはShare Domainにおけるプログラム集であるため、同じアプリケーションでは2つの異なるmscorlib.dllをロードできないので、2つのアプリケーション、一つのFramwark 2.0、もう一つのFramwork 4.0を使用することを考慮します。
これにより、2.0のフレームワークを使用して作成されたプログラムは、frame ebook 4.0のWCFサービスを呼び出すことができます。
コード構造は以下の通りです。
V 4 NewLookはフレームワーク2.0に基づくWinformプログラムです。
V 4 WcfServiceは、frame ewark 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; }
}
}
サービスの実現は、第1の反射バージョンとほぼ同じである。Web.co nfigファイルバインディングコードは以下の通りです。
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();
}
}
}
はデフォルトのmaxReceivedMessage Sizeが65536であるため、後に2つの0が追加されています。そうでないと、経典の範囲外の異常をスローします。WinFormプログラムの画面は以下の通りです。
バックグラウンドコードは以下の通りです。
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="NewBinding0" maxReceivedMessageSize="65536000" />
</wsHttpBinding>
<mexHttpBinding>
<binding name="NewBinding1" />
</mexHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="V4WcfService.Service1Behavior"
name="V4WcfService.Service1">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="NewBinding0"
contract="V4WcfService.IService1">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="NewBinding1"
contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="V4WcfService.Service1Behavior">
<!-- , false -->
<serviceMetadata httpGetEnabled="true"/>
<!-- , true。 false -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
検索ボタンの機能は現在のFrame ebook 2.0のすべてのTypeをすべてのTypeの中のMember Infoを要求にカプセル化してWCFサービスを起動します。サービスは伝達されたTypeとメンバーInfoによって追加の方法と種類を出力します。運転効果は以下の通りです。
4.0のFile類はReadLiness.ApppendAllLiners方法を追加したと見られます。上に二つのReadlinesが見られたのは、Readlines方法が二つの重さによって運ばれるからです。