理解する上で.NETアプリケーションドメインで

まず、入力された.NETアプリケーションドメイン

まあ、.NET Framwork CLRはあまりにも本当に賢いです!より多くの基礎となるプログラミングネットの理解、そのようなアーキテクチャとして、いくつかの複雑さを詳述したように、プロセスが完全に感銘を受けている私たちは不可能だけで良いものの細部を無視する前に、そう、再び逃しました、.NET Frameworkの一部として、AppDomainのは、マイクロソフトによって導入され、非常にクールな概念であり、AppDomainのと呼ばれるCLR、と並んで共同作業側のコアコンポーネントがあります。

より良いネットのAppDomainとAppDomianは、我々はそれを作成し、作業方法に影響を理解し、またはより良い初めに始まるので、私たちは、起動するたびに、私は、アプリケーション内から起動する]ボタンをクリックしてみましょうするためには、アプリケーションは、我々は実際にWin32プロセスを開始し、この過程で私たちのプログラムを実行します。これらは、このようなメモリを使用するもの、オブジェクトとして処理し、その一部のカーネルリソースがある、任意のWin32プロセスは(マルチスレッド化され、その後、より多くの、)少なくとも一つのスレッドが含まれている、と私たちは他のタスクを実行する場合、または当社からアプリケーション開いて、他のアプリケーションのWin32マルチスレッドのコレクションを実行するために我々のプロセスの一部である場合、これらのタスク。

Win32プロセスは、プロセスで通信するのは簡単ですが、Win32プロセスの外部と通信したいと他のWin32プロセスと通信するために、いくつかのレベルで多くの制限を受ける、彼と仮想の境界に非常によく似ている機能を持っていますいくつかのセキュリティコンテキストが(セキュリティコンテキスト)考慮する必要があり、また、特定のシステムで考慮される必要がある、Win32プロセスが行うことができますし、何をすべきではないがあるので、我々は、いくつかの特別な機構を必要としています。

だから、誰がプロセスを実行する責任がありますか?成功した操作が要因が関与するプロセスが必要?プロセスのアクティブ状態を維持しつつ、実装プロセスと私たちのコードを実行するプロセスは、特権ドメイン(ドメイン)およびオペレーティングシステムであり、オペレーティングシステムは、多くの状況に対処しなければならないと、聞かせての責任指摘します今実際の状況を見てください。

私たちは、今、我々が扱っている何を見て、私たちのシステムでWindowsアプリケーションの束を実行し、する必要がある場合がありますことを、次の場合を考えてみましょう、私たちの搭乗内のサーバのWebアプリケーションの数、または、我々は見ていますその用途は何ですか、それは資源であります!リソース!利用できるその他のリソース。私たちのリソース(メモリ)は非常に安全であり、私たちは同時に異なる顧客のためのプログラムを実行すると、セキュリティ上の問題が表示されるようになったとき、私たちは完全にこれらのアプリケーション間で禁止するため緊急の必要があるがしかし、この(どのような方法で通信を処理します紛争や需要)が常にありますが、これは多くの場合、メモリ不足のプロセスが適用される別のプロセスで、頻繁にクラッシュにつながる、その後、クラッシュの原因となります。クロスボーダーによって引き起こされるなど、いずれの場合においても、当社のプロセスは非常に悪いです、何も新鮮な、これらのランタイムエラーは通常、オブジェクトが頻繁に発生するメモリリーク少ない効率的なメモリ使用量によって引用空になっている、メモリ。したがって、我々は、マルチユーザー環境の下で作成された、ますます認識している、操作は、保守プロセスは非常に、非常に高価です。彼らは非常に良い適応性刻みではないのでそのため、実行中のプロセスの多くは、良いアイデアではありません。

この場合、非常に独創的なソリューションは、複数のアプリケーションはあまりにもさらに高速実行速度になりますこれ、私たちはより少ないリソースを使用することができますが、そこにある実行するために、同じホストプロセスでは、浮上しています別のシーンでは一日に発生します。アプリケーションがクラッシュした後に、この同じプロセス内の他のすべてのアプリケーションは、すべての合計を取得カードのようになります!はい、私たちは話しているようにドミノ効果です。

我々は今、どのようにすればよいですか?

使用の.NetのAppDomainこと。この概念は非常に巧妙な、革新的なアイデアです。ノーベル賞、アプリケーションドメインの導入の主な目的の価値があるが、Win32の中に別のプロセスで、アプリケーションドメインの実行を我々のアプリケーションや他のアプリケーションを分離することです。私達はちょうどメモリリークによって引き起こされる制限エラーやクラッシュに、内側のアプリケーションドメインを介して私たちのアプリケーションを実行するための溶液と同じについて話しました。

したがって、我々は、アプリケーション内で実行中のアプリケーションを持っている、と私たちは同時に、単一のWin32プロセスで複数のアプリケーションドメインを実行して、マネージコードのCLRを実行する機能を通じて、我々はさらにまた、感謝のCLRのようなリークやクラッシュを(減らすことができますガベージコレクタ)、同じアプリケーション内のオブジェクト間の直接通信を使用すると、相互に通信する場合、別のことで、オブジェクトをコピーする必要がある、またはメッセージ交換により、異なるアプリケーション・ドメイン・オブジェクトで生き残ります剤(参照によって)。

これは、アプリケーションドメインの核心であるが、多くはもっとありますが、アプリケーションドメインは、我々は上記の言ったように、我々はWin32プロセスすることができ、実際には、単一のプロセスでWin32プロセスを実行している小型・軽量に相当します複数のアプリケーションドメインを実行し、別のAppDomainの利点は、我々は、プロセス中に存在する他のAppDomainに影響を与えずに、ホスト(例えばAsp.Netなど)でのAppDomainを取り除くことができ、ある、我々のアプリケーションので、仕事ドメインは、我々は.NETランタイムを強制的に魔法のメモリの制御を引き継ぐのAppDomain別のメカニズムを使用して、アプリケーションドメインを破壊することによって、ターゲットをロードするためのAppDomainをアンインストールすることができ、さらに、独立して、Win32プロセスただ冒頭で述べたようにアプリケーションドメイン内のすべてのメモリは、そのような別のアプリケーションのメモリにアクセスするすべてのアプリケーションでの問題として、我々は避けるように、ネット実行時の管理で使用されます。私たちが実際にセキュリティ、現在のアプリケーションの分離の別の層を適用するこれにより、クラッシュによって引き起こされるランタイムエラーの問題を避け、他のアプリケーションが事実上は別に、我々は同様のランニングを作成しますセキュリティ面や基本的な点で重要な役割を果たしているアプリケーション、アプリケーションドメインなどの際にWebサービス。

二、AppDomainのは理解して

为了保证代码的健壮性CLR希望不同服务功能的代码之间相互隔离,这种隔离可以创建多个进程来实现,但操作系统中创建进程是即耗时又耗资源的一件事,所以在CLR中引入了AppDomain的概念。AppDomain主要是用来实现同一个进程中的各AppDomain之间的隔离,AppDomain可以用以下特征来描述他的全貌:

1、AppDomain概念并不存在于操作系统中,而只存在于.Net中,并且AppDomain不可脱离进程单独存在,他是属于某一个CLR或寄宿着CLR的进程中的。

2、一个进程中可以有多个AppDomain,并且每个之间相互隔离(只保证安全代码的隔离,不安全代码并不能保证),因此可以理解为AppDomain是.Net进程中的“进程”,在一个AppDomain中创建的对象只属于本AppDomain,多个AppDomain之间的对象不能够相互访问,除非遵循CLR的一些规则。

3、.Net程序启动时,在进程中创建一个默认的AppDomain,入口代码将运行于此AppDomain,默认应用程序域只有在进程终止时才会被销毁,如果主动调用Unload去卸载默认应用程序域,会抛出一个CannotUnloadAppDomainException。

4、每个AppDomain都单独的加载程序集,这意味着在A应用程序域中加载了的程序集,并不一定在B应用程序域中也被加载了。每个AppDomain有单独的Loader堆,相互不影响,每个Loader推都记录了自AppDomain建立以后所访问过的类型,Loader堆中的每个类型对象都有一个方法表,这些放发表指向已经被JIT编译过的本地代码(前提是这些方法是已经被至少执行过一次的)。因为AppDomain是相互隔离的,所以相同的一个类中的方法,在A应用程序域中被JIT编译过的,但不一定在B应用程序域中也是被JIT编译过的,方法是否被JIT编译过取决于这些方法是否在本地的AppDomain被调用过。

5、当AppDomain被卸载时,此AppDomain中的程序集会被卸载,因为每个AppDomain加载的程序集都是独立的,所以每个应用程序域被卸载并不会影响其他的AppDomain中加载的程序集,另外本AppDomain的Loader堆也会被回收,每个程序域中的Loader堆时独立的,所以也不会影响到其他程序域中的Loader堆,因为Loader堆也是独立的(静态字段时存在于类型对象上的),所以一个类型中静态字段在不同应用程序域中也是不同的存在,所以静态字段也是不被影响的,唯一受影响的是线程,因为线程可以跨越应用程序域访问不同的应用程序域上的代码,后面我们会介绍当卸载一个应用程序域时如何对线程做处理。

6、有一种程序集可以被多个AppDomain使用,这种程序集叫做“AppDomain中立”的程序集,比如MSCorLib.dll,该程序集包含了System.Object、System.Int32以及其他的与.Net Framework比不可分的类型,这个程序集在CLR初始化时会自动加载,JIT会为这些程序集创建一个特殊的Loader堆,并且程序集中的方法被编译成本地代码可被所有AppDomain共享,这种程序集不可被卸载,只有当进程结束时这种程序集才会被卸载。

好了,我们来看看如何创建一个基本的应用程序域吧。

实际上,.Net Framework提供了一个漂亮的基类,他存在于System命名空间下,通过他我们可以显示的创建一个AppDomain,在我们的应用程序中,继承System.MarshalByRefObject基类,我们可以创建可以在不同应用程序域间通信的对象。

看看这个吧。一个使用C#创建AppDomain的应用程序,我们使用的是Windows控制台程序

 

 1     class Program
 2     {
 3         static void Main()
 4         {
 5             // Get and display the friendly name of the default AppDomain.
 6             string callingDomainName = Thread.GetDomain().FriendlyName;
 7             Console.WriteLine(callingDomainName);
 8 
 9             // Get and display the full name of the EXE assembly.
10             string exeAssembly = Assembly.GetEntryAssembly().FullName;
11             Console.WriteLine(exeAssembly);
12 
13             // Construct and initialize settings for a second AppDomain.
14             AppDomainSetup ads = new AppDomainSetup();
15             ads.ApplicationBase =
16                 System.Environment.CurrentDirectory;
17             ads.DisallowBindingRedirects = false;
18             ads.DisallowCodeDownload = true;
19             ads.ConfigurationFile =
20                 AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
21 
22             // Create the second AppDomain.
23             AppDomain ad2 = AppDomain.CreateDomain("AD #2", null, ads);
24 
25             // Create an instance of MarshalbyRefType in the second AppDomain. 
26             // A proxy to the object is returned.
27             MarshalByRefType mbrt =
28                 (MarshalByRefType)ad2.CreateInstanceAndUnwrap(
29                     exeAssembly,
30                     typeof(MarshalByRefType).FullName
31                 );
32 
33             // Call a method on the object via the proxy, passing the 
34             // default AppDomain's friendly name in as a parameter.
35             mbrt.SomeMethod(callingDomainName);
36 
37             // Unload the second AppDomain. This deletes its object and 
38             // invalidates the proxy object.
39             AppDomain.Unload(ad2);
40             try
41             {
42                 // Call the method again. Note that this time it fails 
43                 // because the second AppDomain was unloaded.
44                 mbrt.SomeMethod(callingDomainName);
45                 Console.WriteLine("Sucessful call.");
46             }
47             catch (AppDomainUnloadedException)
48             {
49                 Console.WriteLine("Failed call; this is expected.");
50             }
51 
52             Console.ReadKey();
53         }
54     }
55 
56     public class MarshalByRefType : MarshalByRefObject
57     {
58         //  Call this method via a proxy.
59         public void SomeMethod(string callingDomainName)
60         {
61             // Get this AppDomain's settings and display some of them.
62             AppDomainSetup ads = AppDomain.CurrentDomain.SetupInformation;
63             Console.WriteLine("AppName={0}, AppBase={1}, ConfigFile={2}",
64                 ads.ApplicationName,
65                 ads.ApplicationBase,
66                 ads.ConfigurationFile
67             );
68 
69             // Display the name of the calling AppDomain and the name 
70             // of the second domain.
71             // NOTE: The application's thread has transitioned between 
72             // AppDomains.
73             Console.WriteLine("Calling from '{0}' to '{1}'.",
74                 callingDomainName,
75                 Thread.GetDomain().FriendlyName
76             );
77         }
78     }

ok,AppDomain就先介绍到这里,这真是一个巧妙的设计呢。

おすすめ

転載: www.cnblogs.com/xiaomowang/p/12339908.html