Sunday, May 26, 2013

.NET Interview Question: Application Domains

Q1. What is an application domain?

An AppDomain can be thought of as a lightweight process. Multiple AppDomains can exist inside a Win32 process. The primary purpose of the AppDomain is to isolate applications from each other, and so it is particularly useful in hosting scenarios such as ASP.NET. An AppDomain can be destroyed by the host without affecting other AppDomains in the process.

Win32 processes provide isolation by having distinct memory address spaces. This is effective, but expensive. The .NET runtime enforces AppDomain isolation by keeping control over the use of memory - all memory in the AppDomain is managed by the .NET runtime, so the runtime can ensure that AppDomains do not access each other's memory.

One non-obvious use of AppDomains is for unloading types. Currently the only way to unload a .NET type is to destroy the AppDomain it is loaded into. This is particularly useful if you create and destroy types on-the-fly via reflection.

Q2. How does an AppDomain get created?

AppDomains are usually created by hosts. Examples of hosts are the Windows Shell, ASP.NET and IE. When you run a .NET application from the command-line, the host is the Shell. The Shell creates a new AppDomain for every application.

AppDomains can also be explicitly created by .NET applications. Here is a C# sample which creates an AppDomain, creates an instance of an object inside it, and then executes one of the object's methods:

using System;
using System.Runtime.Remoting;
using System.Reflection;
public class CAppDomainInfo : MarshalByRefObject
{
  public string GetName() { return                 AppDomain.CurrentDomain.FriendlyName; }
}  
  public class App
{
  public static int Main()
{
  AppDomain ad = AppDomain.CreateDomain( "Andy's new domain" );
  CAppDomainInfo adInfo =     (CAppDomainInfo)ad.CreateInstanceAndUnwrap(
  Assembly.GetCallingAssembly().GetName().Name, "CAppDomainInfo"   );
  Console.WriteLine( "Created AppDomain name = " +   adInfo.GetName() );
return 0;
}
}

Q3. Can I write my own .NET host?

Yes. For an example of how to do this, take a look at the source for the dm.net moniker developed by Jason Whittington and Don Box. There is also a code sample in the .NET SDK called CorHost.

No comments:

Post a Comment

Automatic Traffic Exchange

YallaTech Facebook page