12 Mart 2018 Pazartesi

AppDomain Sınıfı

Giriş
Şu satırı dahil ederiz.
using System.AppDomain.CurrentDomain;
Her AppDomain için static metodlar yeniden çalıştırılır. Örneğin birden fazla python kodu çalıştırmak için kullanılabilir.

BaseDirectory Alanı
Şyöle yaparız.
//i.e; D:\Projects\MyApp\API\)
string basePath = System.AppDomain.CurrentDomain.BaseDirectory;
CreateDomain
Yeni bir domain yaratır.
Örnek
Şöyle yaparız.
AppDomain domain = AppDomain.CreateDomain("Domain");
Örnek
Şöyle yaparız.
var friendlyName = "PlayerAppDomain";
var assembly = Assembly.GetExecutingAssembly();
var codeBase = assembly.Location;
var codeBaseDirectory = Path.GetDirectoryName(codeBase);
var info = new AppDomainSetup()
{
  ApplicationName = "OurCompiledScript",
  ApplicationBase = codeBaseDirectory,
  DynamicBase = codeBaseDirectory,

};
AppDomain dom = AppDomain.CreateDomain(friendlyName,
   new System.Security.Policy.Evidence(), info);
CreateInstanceAndUnwrap metodu
Şöyle yaparız.
PluginLoader loader = (PluginLoader)domain.CreateInstanceAndUnwrap(
  Assembly.GetExecutingAssembly().FullName, typeof(PluginLoader).FullName);
CurrentDomain Alanı
Şöyle yaparız.
// Get the current application domain for the current thread
AppDomain currentDomain = AppDomain.CurrentDomain;
CurrentDomain. BaseDirectory Alanı
Uygulamanın çalıştığı dizini verir.
AppDomain.CurrentDomain.BaseDirectory
CurrentDomain. GetAssemblies metodu
Şimdiye kadar sadece yüklü DLL'leri dolaşmak için kullandım.
AppDomain.CurrentDomain.GetAssemblies()
DefineDynamicAssembly metodu
AssemblyBuilder nesnesi yaratır.
Örnek
Şöyle yaparız.
// Get the current application domain for the current thread
AppDomain currentDomain = AppDomain.CurrentDomain;

// Create a dynamic assembly in the current application domain,
// and allow it to be executed and saved to disk.
AssemblyName name = new AssemblyName("MyEnums");
AssemblyBuilder assemblyBuilder = currentDomain.DefineDynamicAssembly(name,
                                      AssemblyBuilderAccess.RunAndSave);
Örnek
Şöyle yaparız.
 var assmName = new AssemblyName("DynamicAssemblyExample");
var assmBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assmName,
  AssemblyBuilderAccess.RunAndSave);
DomainUnload eventi
Domain bellekten silinmeden önce çağrılır.
AppDomain.CurrentDomain.DomainUnload += CleanupBeforeExit;
DoCallBack metodu
Sanırım AppDomain nesnenin döngüsünü başlatıyor.
Örnek
Şöyle yaparız.
AppDomain domain = AppDomain.CreateDomain("Domain");
domain.DoCallBack(() =>{...});
Örnek
Şöyle yaparız.
AppDomain domain = AppDomain.CreateDomain("New Domain");
domain.DoCallBack(new CrossAppDomainDelegate(Launch));
Callback şöyledir.
static void Launch()
{
  Assembly s = Assembly.Load(File.ReadAllBytes(@"C:\my.dll"));
  ...
}
FirstChanceException eventi
FirstChanceException bir Microsoft kavramı. Diğer debugger geliştiricilerinde böyle bir kavram yok. FirstChanceException normalde debugger tarafından kullanılır. Exception uygulamaya verilmeden önce debugger'ı durdurup değişkenleri inceleme imkanı tanır.

Bazen kod içinde de işimize yaradığı durumlar olabilir.
Açıklaması şöyle
Occurs when an exception is thrown in managed code, before the runtime searches the call stack for an exception handler in the application domain.
Şöyle kodlarız
AppDomain.CurrentDomain.FirstChanceException += 
      (object source, FirstChanceExceptionEventArgs e) =>
{
  Console.WriteLine("FirstChanceException event raised in {0}: {1}",
       AppDomain.CurrentDomain.FriendlyName, e.Exception.Message);
};
Unmanaged koda yapılan çağrıdaki exception da managed kod içinde exception'a döndürülür. İşte bu noktada da kullanılabilir.

Id Alanı
Her AppDomain nesnesinin bir numarası var. İlk numara 1'den başlar.
AppDomain appDomain = ...; // AppDomain creation
...appDomain.Id;
Load metodu
Örnek
Şöyle yaparız.
Assembly a = ...;
AppDomain.CurrentDomain.Load (a.GetName());
Örnek
Şöyle yaparız.
string dll = ...;
Assembly scriptAssembly = domain.Load(new AssemblyName(Path.GetFileName(dll)));
UnhandledException Event'i
Şöyle yaparız.
appDomain.UnhandledException += 
  new UnhandledExceptionEventHandler(UnhandledExceptionHandler);

void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs args)
{
  try
  {
    Exception ex = (Exception)args.ExceptionObject;
    ...
   }
   finally { }
}
Unload metodu
Şöyle yaparız.
AppDomain domain = ...;
AppDomain.Unload(dom);


Hiç yorum yok:

Yorum Gönder