Aracılığıyla paylaş


Uygulama etki alanları

Uyarı

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, versiyon yönetimi ve derlemelerin kaldırılması konusunda bir yalıtım sınırı sağlar. Uygulama etki alanları, bir uygulama çalıştırılmadan önce ortak dil çalışma zamanını önyüklemeden sorumlu olan çalışma zamanı ana bilgisayarları tarafından genellikle oluşturulur.

Uygulamaların yalıtılmasının faydaları

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.

    Uyarı

    Tek tek derlemeleri veya türleri kaldıramazsınız. Yalnızca tüm bir etki alanı yüklenebilir.

  • 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 ya kopyalanır ya da bir proxy üzerinden 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 FileNotFoundException türünde bir özel durum nedeniyle 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 alanları ve bütünleştirmeler

Bu bölümde, uygulama etki alanları ve derlemeler arasındaki ilişki açıklanmaktadır. Bir derlemeyi, içerdiği kodu yürütebilmeniz için önce bir uygulama etki alanına yüklemeniz gerekir. Tipik bir uygulamanın çalıştırılması, bir uygulama etki alanına birkaç derlemenin yüklenmesine neden olur.

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ı ve derlemenin işlemden kaldırılıp kaldırı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 ve bu da uygulamanın gerektirdiği belleği azaltır. Ancak derleme hiçbir zaman işlemden kaldırılamaz.

  • Bir derleme etki alanı nötr olarak yüklenmezse, yüklendiği her uygulama etki alanında JIT ile derlenmelidir. Ancak, meclis, yüklendiği tüm uygulama etki alanları kaldırılarak işlemden çıkarılabilir.

Çalışma zamanı ana bilgisayarı, çalışma zamanını bir işleme yüklerken derlemelerin etki alanı bağımsız olarak yüklenip yüklenmeyeceğini belirler. Yönetilen uygulamalar için özniteliğini LoaderOptimizationAttribute işlemin giriş noktası yöntemine uygulayın ve ilişkili LoaderOptimization numaralandırmadan 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ı nötr derlemeleri yüklemek için üç seçenek vardır:

  • LoaderOptimization.SingleDomain her zaman etki alanı nötr olarak yüklenen Mscorlib dışında hiçbir derlemeyi etki alanı nötr olarak yüklemez. Bu ayara tek etki alanı denir çünkü ana makine süreçte yalnızca tek bir uygulama çalıştırırken yaygın olarak kullanılır.

  • LoaderOptimization.MultiDomain tüm derlemeleri etki alanı nötr olarak yükler. İşlemde birden çok uygulama etki alanı olduğunda ve tümü aynı kodu çalıştırdığında bu ayarı kullanın.

  • LoaderOptimization.MultiDomainHost tanımlayıcı adlandırılmış derlemeleri etki alanı nötr olarak yükler, eğer kendileri ve tüm bağımlılıkları genel derleme önbelleğine yüklenmişse. Diğer derlemeler, yüklendikleri her uygulama etki alanı için ayrı olarak yüklenir ve JIT ile derlenir ve bu nedenle işlemden kaldırılabilir. Birden fazla uygulamayı aynı işlemde çalıştırıyorsanız veya birçok uygulama etki alanı tarafından paylaşılan ve işlemden kaldırılması gereken derlemelere sahipseniz bu ayarı kullanın.

JIT ile derlenmiş kod, LoadFrom sınıfının Assembly yöntemi kullanılarak yükleme bağlamına yüklenen derlemeler için paylaşılamaz veya bayt dizilerini belirten Load yönteminin aşırı yüklemeleri kullanılarak görüntülerden yüklenemez.

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 ile derlenmiş kod, yalnızca tüm bağımlılıkları paylaşılabilirse paylaşılır.

Etki alanı nötr derlemesi birden çok kez JIT ile derlenebilir. Örneğin, iki uygulama etki alanının güvenlik izni kümeleri farklı olduğunda, aynı JIT ile derlenmiş kodu paylaşamazlar. Ancak, JIT ile derlenmiş derlemenin her kopyası aynı izin kümesine sahip diğer uygulama etki alanlarıyla paylaşılabilir.

Derlemeleri etki alanı nötr olarak yükleyip yüklememeye karar verdiğinizde, bellek kullanımını azaltma ile diğer performans faktörleri arasında bir denge kurmalısınız.

  • Derlemeleri yalıtma gereğinden, etki alanı nötr derlemeler için statik verilere ve yöntemlere erişim daha yavaştır. Statik alanlardaki nesnelere yapılan başvuruların etki alanı sınırlarını aşmasını önlemek için, derlemeye erişen her uygulama etki alanının statik verilerin ayrı bir kopyası olmalıdır. Sonuç olarak, çalışma zamanı bir çağıranı statik verilerin 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.

  • Bir derlemenin tüm bağımlılıkları, derleme etki alanı nötr yüklendiğinde bulunmalı ve etki alanı nötr yüklenmelidir. Etki alanı nötr olarak yüklenemeyen bir bağımlılık, derlemenin etki alanı nötr yüklenmesini engeller.

Uygulama etki alanları ve iş parçacıkları

Uygulama etki alanı, yönetilen kodun güvenliği, sürümlemesi, güvenilirliği ve yükünün kaldırılması için bir yalıtım sınırı oluşturur. İş parçacığı, kod yürütmek için ortak dil çalışma zamanı tarafından 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 işletim 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. İş parçacığının yürütülmekte olduğu etki alanını dilediğiniz zaman Thread.GetDomain yöntemini çağırarak 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ğin değeri null değilse, özellik tarafından döndürülen kültür iş parçacığıyla ilişkilidir (bu nedenle Thread.CurrentCulture ve CultureInfo.CurrentCulture özellikleri tarafından döndürülür).

  • Özelliğin değeri null ise, geçerli sistemin kültürü iş parçacığı ile ilişkilendirilir.

Uygulama etki alanlarıyla programlama

Uygulama etki alanları genellikle çalışma zamanı konakları tarafından programatik olarak oluşturulur ve yönetilir. Ancak, bazen bir uygulama programı da uygulama etki alanlarıyla çalışmak isteyebilir. Örneğin bir uygulama programı, uygulamanın tamamını durdurmak zorunda kalmadan etki alanını (ve bileşeni) kaldırabilmek için bir uygulama bileşenini bir etki alanına yükleyebilir.

AppDomain, uygulama etki alanlarına programlı arabirimdir. Bu sınıf, etki alanları oluşturma ve kaldırma, etki alanlarında tür örnekleri oluşturma ve uygulama etki alanı kaldırma gibi çeşitli bildirimlere kaydolma yöntemlerini 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 nesnesini belirten aşırı yüklemesini kullanmanız önerilir. Bu, uygulama tabanı veya uygulamanın kök dizini gibi yeni bir etki alanının özelliklerini ayarlamak için tercih edilen yöntemdir; etki alanının yapılandırma dosyasının konumu; ve ortak dil çalışma zamanının, derlemeleri etki alanına yüklemek için kullandığı arama yolu.
ExecuteAssembly ve ExecuteAssemblyByName Uygulama etki alanında bir derleme yürütür. Bu bir örnek yöntemidir, bu nedenle referans verilen başka bir uygulama etki alanında kod çalıştırmak için kullanılabilir.
CreateInstanceAndUnwrap Uygulama etki alanında belirtilen türde bir örnek oluşturur ve bir ara sunucu döndürür. Oluşturulan türü içeren derlemeyi çağıran derlemeye yüklemekten kaçınmak için bu yöntemi kullanın.
Unload Alan adının uygun bir biçimde kapatılmasını gerçekleştirir. Etki alanında çalışan tüm iş parçacıkları durdurulana veya artık etki alanında olmayana kadar uygulama etki alanı kaldırılmaz.

Uyarı

Ortak dil çalışma zamanı genel yöntemlerin serileştirilmesini desteklemediğinden, temsilciler diğer uygulama etki alanlarında genel yöntemleri yürütmek için kullanılamaz.

Ortak dil çalışma zamanı Barındırma Arabirimleri Belirtimi'nde açıklanan yönetilmeyen arabirimler de uygulama etki alanlarına erişim sağlar. Çalışma zamanı konakları, bir işlem içindeki uygulama etki alanlarını oluşturmak ve erişim elde etmek için yönetilmeyen koddan arabirimler kullanabilir.

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ın tüm derlemeleri, Tek Etki Alanı (SingleDomain) olarak bilinen ve etki alanına özgü olmayan şekilde yüklemesini 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 ayara tek etki alanı denir çünkü ana makine süreçte 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 gerektiğinde, Ortamın Çoklu Dize Değeri'ne HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\IISADMIN anahtarında COMPLUS_LoaderOptimization=1 ekleyerek gerçekleştirilebilir.

Key = HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\IISADMIN
Name = Environment
Type = REG_MULTI_SZ
Value (to append) = COMPLUS_LoaderOptimization=1

Ayrıca bakınız