Uygulama etki alanları
Not
Bu makale .NET Framework'e özgüdür. .NET 6 ve sonraki sürümleri de dahil olmak üzere daha yeni .NET uygulamaları için geçerli değildir.
İşletim sistemleri ve çalışma zamanı ortamları genellikle uygulamalar arasında bir tür yalıtım sağlar. Örneğin, Windows uygulamaları yalıtmak için işlemleri kullanır. Bu yalıtım, bir uygulamada çalışan kodun diğer, ilgisiz uygulamaları olumsuz etkilemediğinden emin olmak için gereklidir.
Uygulama etki alanları güvenlik, güvenilirlik ve sürüm oluşturma ile derlemelerin kaldırılması için bir yalıtım sınırı sağlar. Uygulama etki alanları genellikle bir uygulama çalıştırılana kadar ortak dil çalışma zamanına önyüklemeden sorumlu olan çalışma zamanı konakları tarafından oluşturulur.
Uygulamaları yalıtma avantajları
Geçmişte işlem sınırları, aynı bilgisayarda çalışan uygulamaları yalıtmak için kullanılmıştır. Her uygulama, uygulamayı aynı bilgisayarda çalışan diğer uygulamalardan yalıtan ayrı bir işleme yüklenir.
Bellek adresleri işlem göreli olduğundan uygulamalar yalıtılır; Bir işlemden diğerine geçirilen bellek işaretçisi, hedef işlemde anlamlı bir şekilde kullanılamaz. Ayrıca, iki işlem arasında doğrudan çağrı yapamazsınız. Bunun yerine, bir dolaylılık düzeyi sağlayan proxy'ler kullanmanız gerekir.
Yönetilen kodun çalıştırılabilmesi için bir doğrulama işleminden geçirilmesi gerekir (yönetici doğrulamayı atlama izni vermemişse). Doğrulama işlemi, kodun geçersiz bellek adreslerine erişmeye çalışabileceğini veya çalıştırıldığı işlemin düzgün çalışmamasına neden olabilecek başka bir eylem gerçekleştirip gerçekleştiremeyeceğini belirler. Doğrulama testini geçen kodun tür açısından güvenli olduğu söylenir. Kodun tür açısından güvenli olarak doğrulanabilmesi, ortak dil çalışma zamanının çok daha düşük performans maliyetiyle işlem sınırı kadar büyük bir yalıtım düzeyi sağlamasına olanak tanır.
Uygulama etki alanları, ortak dil çalışma zamanının uygulamalar arasında yalıtım sağlamak için kullanabileceği daha güvenli ve çok yönlü bir işlem birimi sağlar. Birden çok uygulama etki alanını ayrı işlemlerde mevcut olan yalıtım düzeyiyle tek bir işlemde çalıştırabilirsiniz, ancak işlemler arası çağrılar yapma veya işlemler arasında geçiş yapma ek yüküne neden olmaz. Tek bir işlem içinde birden çok uygulama çalıştırma özelliği, sunucu ölçeklenebilirliğini önemli ölçüde artırır.
Uygulamaları yalıtma, uygulama güvenliği için de önemlidir. Örneğin, denetimlerin birbirlerinin verilerine ve kaynaklarına erişemeyeceği şekilde tek bir tarayıcı işleminde birkaç Web uygulamasından denetim çalıştırabilirsiniz.
Uygulama etki alanları tarafından sağlanan yalıtımın aşağıdaki avantajları vardır:
Bir uygulamadaki hatalar diğer uygulamaları etkileyemez. Tür açısından güvenli kod bellek hatalarına neden olamadığından, uygulama etki alanlarının kullanılması bir etki alanında çalışan kodun işlemdeki diğer uygulamaları etkilememesini sağlar.
Tek tek uygulamalar tüm işlemi durdurmadan durdurulabilir. Uygulama etki alanlarını kullanmak, tek bir uygulamada çalışan kodu kaldırmanıza olanak tanır.
Not
Tek tek derlemeleri veya türleri kaldıramazsınız. Yalnızca tam bir etki alanı kaldırılabilir.
Bir uygulamada çalışan kod, başka bir uygulamadaki koda veya kaynaklara doğrudan erişemez. Ortak dil çalışma zamanı, farklı uygulama etki alanlarındaki nesneler arasında doğrudan çağrı yapılmasını engelleyerek bu yalıtımı zorlar. Etki alanları arasında geçen nesneler, proxy tarafından kopyalanır veya bu nesnelere erişilir. Nesne kopyalanırsa, nesneye yapılan çağrı yereldir. Diğer bir ifadeyle, hem çağıran hem de başvuruda bulunan nesne aynı uygulama etki alanındadır. Nesneye bir ara sunucu üzerinden erişilirse, nesneye yapılan çağrı uzaktır. Bu durumda, çağıran ve başvuruda bulunan nesne farklı uygulama etki alanlarındadır. Etki alanları arası çağrılar, iki işlem veya iki makine arasındaki çağrılarla aynı uzaktan çağrı altyapısını kullanır. Bu nedenle, yöntem çağrısının düzgün bir şekilde derlenmesini sağlamak için başvuruda bulunulmakta olan nesnenin meta verilerinin her iki uygulama etki alanı için de kullanılabilir olması gerekir. Çağıran etki alanının çağrılan nesnenin meta verilerine erişimi yoksa, derleme türü FileNotFoundExceptionözel durumuyla başarısız olabilir. Daha fazla bilgi için bkz . Uzak Nesneler. Nesnelere etki alanları arasında nasıl erişilebileceğini belirleme mekanizması nesne tarafından belirlenir. Daha fazla bilgi için bkz. System.MarshalByRefObject.
Kodun davranışının kapsamı, çalıştığı uygulama tarafından belirlenmiştir. Başka bir deyişle, uygulama etki alanı uygulama sürümü ilkeleri, eriştiği uzak derlemelerin konumu ve etki alanına yüklenen derlemelerin nerede bulunacağı hakkında bilgi gibi yapılandırma ayarları sağlar.
Koda verilen izinler, kodun çalıştığı uygulama etki alanı tarafından denetlenebilir.
Uygulama Etki Alanları ve derlemeler
Bu bölümde, uygulama etki alanları ve derlemeler arasındaki ilişki açıklanmaktadır. Bir derlemenin içerdiği kodu yürütmeden önce derlemeyi bir uygulama etki alanına yüklemeniz gerekir. Tipik bir uygulamayı çalıştırmak, bir uygulama etki alanına birkaç derlemenin yüklenmesine neden olur.
Bir derlemenin yüklenme şekli, onun işlemdeki birden çok uygulama etki alanı ile paylaşılabilen anlık (JIT) derlenmiş kod olup olmadığını ve derlemenin işlemden kaldırılabilip kaldırılamayacağını belirler.
Eğer bir derleme etki alanından bağımsız olarak yüklenirse, aynı güvenlik izni kümesine sahip olan tüm uygulama etki alanları aynı JIT olarak derlenmiş kodunu paylaşabilir ve bu da uygulamanın gerektirdiği belleği azaltır. Ancak, derleme işlemden asla kaldırılamaz.
Eğer bir derleme etki alanından bağımsız olarak yüklenmezse, yüklendiği tüm uygulama etki alanlarında JIT olarak derlenmelidir. Ancak derleme, yüklü olduğu tüm uygulama etki alanları kaldırılarak işlemden kaldırılabilir.
Çalışma zamanı konak ortamı, çalışma zamanını bir işleme yüklerken derlemeleri etki alanından bağımsız olarak yükleyip yüklemeyeceğini belirler. Yönetilen uygulamalar için, LoaderOptimizationAttribute özniteliğini işlem için giriş noktası metoduna uygulayın ve ilişkili LoaderOptimization sabit listesinden bir değer belirtin. Ortak dil çalışma zamanını barındıran yönetilmeyen uygulamalar için CorBindToRuntimeEx İşlevi yöntemini çağırırken uygun bayrağı belirtin.
Etki alanından bağımsız derlemeleri yüklemek için üç seçenek vardır:
LoaderOptimization.SingleDomain, her zaman etki alanından bağımsız olarak yüklenen Mscorlib dışındaki hiçbir derlemeyi etki alanından bağımsız olarak yüklemez. Bu ayar tek etki alanı olarak adlandırılır çünkü konak işlemde yalnızca tek bir uygulama çalıştırırken yaygın olarak kullanılır.
LoaderOptimization.MultiDomain, tüm derlemeleri etki alanından bağımsız yükler. İşlemde tamamı aynı kodu çalıştıran birden çok uygulama etki alanı olduğunda bu ayarı kullanın.
LoaderOptimization.MultiDomainHost, tanımlayıcı ada sahip olan derlemeleri, kendileri ve tüm bağımlılıkları genel bütünleştirilmiş kod önbelleğinde yüklü ise, etki alanından bağımsız olarak yükler. Diğer derlemeler yüklü oldukları her uygulama etki alanı için ayrı olarak yüklenip JIT olarak derlenirler ve bu nedenle işlemden kaldırılabilirler. Aynı işlemde birden çok uygulama çalıştırırken veya işlemden kaldırılması gereken birden çok uygulama etki alanı ve derleme tarafından paylaşılan bir derleme karışımına sahipseniz bu ayarı kullanın.
JIT olarak derlenmiş kod, LoadFrom sınıfının Assembly yöntemi kullanarak load-from bağlamı içine yüklenen derlemeler için ya da Load yönteminin bayt dizilerini belirten aşırı yüklemeleri kullanılarak görüntülerden yüklenen derlemeler için paylaşılamaz.
Ngen.exe (Yerel Görüntü Oluşturucu) kullanılarak yerel koda derlenmiş derlemeler, bir işleme ilk kez yüklendiğinde etki alanı nötr olarak yüklenirse uygulama etki alanları arasında paylaşılabilir.
Uygulama giriş noktasını içeren derleme için JIT olarak derlenmiş kod, yalnızca tüm bağımlılıkları paylaşılabiliyorsa paylaşılır.
Etki alanından bağımsız bir derleme JIT olarak birden çok kez derlenebilir. Örneğin, iki uygulama etki alanının güvenlik izni kümeleri farklıysa, aynı JIT olarak derlenmiş kodu paylaşamazlar. Ancak, JIT olarak derlenmiş derlemenin her kopyası, aynı izin kümesine sahip olan diğer uygulama etki alanlarıyla paylaşılabilir.
Derlemeleri etki alanından bağımsız olarak yükleyip yüklemeyeceğinize karar verdiğinizde, bellek kullanımı ve diğer performans etmenleri arasında bir takas yapmanız gerekir.
Etki alanından bağımsız derlemeler için statik verilere ve yöntemlere olan erişim, derlemeleri yalıtmak gerektiği için daha yavaştır. Statik alanlardaki nesnelere olan başvuruların etki alanı sınırlarını geçmesini engellemek için derlemeye erişen tüm uygulama etki alanlarının, statik verinin ayrı kopyalarına sahip olması gerekir. Sonuç olarak, çalışma zamanı bir çağıranı statik veri veya yöntemin uygun kopyasına yönlendirmek için ek mantık içerir. Bu ek mantık, çağrıyı yavaşlatır.
Derleme etki alanından bağımsız olarak yüklendiğinde, derlemenin tüm bağımlılıkları konumlandırılıp yüklenmelidir çünkü etki alanından bağımsız olarak yüklenemeyen bir bağımlılık, derlemenin etki alanından bağımsız olarak yüklenmesini engeller.
Uygulama etki alanları ve iş parçacıkları
Uygulama etki alanı, yönetilen kodun güvenliği, sürüm oluşturması, güvenilirliği ve kaldırılması için bir yalıtım sınırı oluşturur. İş parçacığı, ortak dil çalışma zamanı tarafından kod yürütmek için kullanılan işletim sistemi yapısıdır. Çalışma zamanında, tüm yönetilen kod bir uygulama etki alanına yüklenir ve bir veya daha fazla yönetilen iş parçacığı tarafından çalıştırılır.
Uygulama etki alanları ve iş parçacıkları arasında bire bir bağıntı yoktur. Belirli bir anda tek bir uygulama etki alanında birkaç iş parçacığı yürütülebilir ve belirli bir iş parçacığı tek bir uygulama etki alanıyla sınırlı değildir. Yani iş parçacıklarının uygulama etki alanı sınırlarını aşması ücretsizdir; Her uygulama etki alanı için yeni bir iş parçacığı oluşturulmaz.
Herhangi bir zamanda, her iş parçacığı bir uygulama etki alanında yürütülür. Belirli bir uygulama etki alanında sıfır, bir veya birden çok iş parçacığı yürütülüyor olabilir. Çalışma zamanı hangi iş parçacıklarının hangi uygulama etki alanlarında çalıştığını izler. bir iş parçacığının yürütülmekte olduğu etki alanını istediğiniz zaman yöntemini çağırarak Thread.GetDomain bulabilirsiniz.
Uygulama etki alanları ve kültürleri
Bir CultureInfo nesneyle temsil edilen kültür, iş parçacıklarıyla ilişkilendirilir. özelliğini kullanarak CultureInfo.CurrentCulture şu anda yürütülen iş parçacığıyla ilişkili kültürü alabilir ve özelliğini kullanarak Thread.CurrentCulture yürütülmekte olan iş parçacığıyla ilişkili kültürü alabilir veya ayarlayabilirsiniz. Bir iş parçacığıyla ilişkili kültür açıkça özelliği kullanılarak Thread.CurrentCulture ayarlandıysa, iş parçacığı uygulama etki alanı sınırlarını aştığında bu iş parçacığıyla ilişkilendirilmeye devam eder. Aksi takdirde, herhangi bir zamanda iş parçacığıyla ilişkili kültür, iş parçacığının CultureInfo.DefaultThreadCurrentCulture yürütülmekte olduğu uygulama etki alanındaki özelliğin değeri tarafından belirlenir:
özelliğinin değeri değilse
null
, özelliği tarafından döndürülen kültür iş parçacığıyla ilişkilendirilir (ve bu nedenle ve CultureInfo.CurrentCulture özellikleri tarafından Thread.CurrentCulture döndürülür).özelliğinin değeri ise
null
, geçerli sistem kültürü iş parçacığıyla ilişkilendirilir.
Uygulama etki alanlarıyla programlama
Uygulama etki alanları genellikle programlı olarak çalışma zamanı ana bilgisayarları tarafından oluşturulur ve değiştirilir. Ancak, bazen bir uygulama programı da uygulama etki alanları ile birlikte çalışmak isteyebilir. Örneğin, bir uygulama programı, tüm uygulamayı durdurmasına gerek kalmadan etki alanını (ve bileşeni) kaldırabilmek için bir etki alanına bir uygulama bileşeni yükleyebilir.
AppDomain, uygulama etki alanlarına programlı arabirimdir. Bu sınıf, etki alanları oluşturmak ve kaldırmak, etki alanlarında türlerin örneklerini oluşturmak ve uygulama etki alanı kaldırma gibi belirli bildirimlere kaydolmak için metotlar içerir. Aşağıdaki tabloda yaygın olarak kullanılan AppDomain yöntemler listelenmektedir.
AppDomain Yöntemi | Açıklama |
---|---|
CreateDomain | Yeni bir uygulama etki alanı oluşturur. Bu yöntemin bir AppDomainSetup nesnesi belirten bir aşırı yüklemesini kullanmanız önerilir. Bu; yeni bir etki alanının uygulama temel dizini veya uygulamanın kök dizini, etki alanı için yapılandırma dosyasının konumu ve ortak dil çalışma zamanının etki alanına yeni derlemeler yüklemek için kullanacağı arama yolu gibi özelliklerini ayarlamak için tercih edilen yöntemdir. |
ExecuteAssembly ve ExecuteAssemblyByName | Uygulama etki alanındaki bir derlemeyi yürütür. Bu bir örnek yöntemi olduğundan, atıfta bulunduğunuz başka bir uygulama etki alanındaki kodu yürütmek için kullanılabilir. |
CreateInstanceAndUnwrap | Uygulama etki alanında belirtilen bir türün bir örneğini oluşturur ve bir proxy döndürür. Oluşturulan türü içeren derlemenin, bu derlemeyi çağıran derlemeye yüklenmesini engellemek için kullanın. |
Unload | Etki alanının düzgün bir şekilde kapatılmasını gerçekleştirir. Uygulama etki alanı, etki alanındaki tüm iş parçacıkları durmadan veya etki alanının dışında olmadan kaldırılmaz. |
Not
Ortak dil çalışma zamanı, genel yöntemlerin serileştirilmesini desteklemediğinden, temsilciler kullanılarak diğer uygulama etki alanlarındaki genel yöntemler yürütülemez.
Ortak dil çalışma zamanı Ana Bilgisayarları Arabirimleri Bildirimi'nde açıklanan yönetilmeyen arabirimler de uygulama etki alanlarına erişim sağlar. Çalışma zamanı ana bilgisayarları, yönetilmeyen koddan arabirimler kullanarak bir işlem içinde uygulama etki alanları oluşturabilir veya onlara erişebilir.
COMPLUS_LoaderOptimization ortam değişkeni
Yürütülebilir bir uygulamanın varsayılan yükleyici iyileştirme ilkesini ayarlayan ortam değişkeni.
Sözdizimi
COMPLUS_LoaderOptimization = 1
Açıklamalar
Tipik bir uygulama, içerdikleri kod yürütülmeden önce bir uygulama etki alanına birkaç derleme yükler.
Derlemenin yüklenme şekli, tam zamanında (JIT) derlenmiş kodunun işlemdeki birden çok uygulama etki alanı tarafından paylaşılıp paylaşılamayacağını belirler.
Bir derleme etki alanı nötr olarak yüklenirse, aynı güvenlik izni kümesini paylaşan tüm uygulama etki alanları aynı JIT ile derlenmiş kodu paylaşabilir. Bu, uygulamanın gerektirdiği belleği azaltır.
Bir derleme etki alanı nötr olarak yüklenmediyse, yüklendiği her uygulama etki alanında JIT ile derlenmelidir ve yükleyicinin iç kaynakları uygulama etki alanları arasında paylaşmaması gerekir.
1 olarak ayarlandığında, COMPLUS_LoaderOptimization ortam bayrağı çalışma zamanı ana bilgisayarını tüm derlemeleri Tek Etki Alanı olarak bilinen etki alanı nötr olmayan bir şekilde yüklemeye zorlar. SingleDomain, her zaman etki alanı nötr olarak yüklenen Mscorlib dışında hiçbir derlemeyi etki alanı nötr olarak yüklemez. Bu ayar tek etki alanı olarak adlandırılır çünkü konak işlemde yalnızca tek bir uygulama çalıştırırken yaygın olarak kullanılır.
Dikkat
COMPLUS_LoaderOptimization ortam bayrağı, tanılama ve test senaryolarında kullanılacak şekilde tasarlanmıştır. Bayrağın açık olması ciddi yavaşlamasına ve bellek kullanımında artışa neden olabilir.
Kod örneği
IISADMIN hizmeti için tüm derlemelerin etki alanı nötr olarak yüklenmemesi için, HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\IISADMIN anahtarındaki Ortamın Çok Dizeli Değeri eklenerek COMPLUS_LoaderOptimization=1
elde edilebilir.
Key = HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\IISADMIN
Name = Environment
Type = REG_MULTI_SZ
Value (to append) = COMPLUS_LoaderOptimization=1