代码改变世界

appdomain概念与应用

2017-10-29 09:53  Dirichlet  阅读(307)  评论(0)    收藏  举报

用appcmd命令显示w3wp.exe进程,很多时候一个应用程序池负责创建一个w3wp.exe进程与之对应,可能还有时候是创建多个w3wp.exe,有待验证。

c:\Windows\System32\inetsrv>appcmd list wp
WP "7524" (applicationPool:ASP.NET v4.0)
WP "10600" (applicationPool:website test1)

 

实验目的:对于一个固定的应用程序池,有多个应用程序都绑定到它上面,

实验步骤:步骤Default Web Site下面创建三个应用程序,他们都指定这个应用程序池,那么怎么理解应用程序这个概念?

应用程序对应.net里的应用程序域appdomain,可以把当前的进程,当前进程所有的应用程序域都打印出来。

Process.GetCurrentProcess().ProcessName=w3wp 
||DefaultDomain|| 
||/LM/W3SVC/1/ROOT/WebApplication3-1-131496832889509069||
||/LM/W3SVC/1/ROOT/WebApplication2-2-131496833064771698||
||/LM/W3SVC/1/ROOT/WebApplication1-3-131496833182925146||

这三个IIS应用程序域都在相同的进程w3wp内,他们对应进程内的三个应用程序域WebApplication1,WebApplication2,WebApplication3

 

打印应用程序域的示例代码:

public partial class _Default : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Response.Write($"Process.GetCurrentProcess().ProcessName={Process.GetCurrentProcess().ProcessName}\r\n");
            Response.Write(GetAllAppDomains());
        }

        public static string GetAllAppDomains()
        {
            //AppDomain one = AppDomain.CreateDomain("One");
            //AppDomain two = AppDomain.CreateDomain("Two");

            // Creates 2 app domains           
            List<AppDomain> appDomains = new List<AppDomain>();
            IntPtr enumHandle = IntPtr.Zero;
            var host = new CorRuntimeHostClass();
            StringWriter writer = new StringWriter();

            try
            {
                host.EnumDomains(out enumHandle);
                object domain = null;
                AppDomain tempDomain;

                while (true)
                {
                    host.NextDomain(enumHandle, out domain);
                    if (domain == null)
                    {
                        break;
                    }

                    tempDomain = domain as AppDomain;
                    appDomains.Add(tempDomain);
                }
            }
            catch (Exception ex)
            {
                writer.WriteLine(ex.ToString());
            }
            finally
            {
                host.CloseEnum(enumHandle);
                int rel = Marshal.ReleaseComObject(host);
            }

            Assembly[] assemblies;

            foreach (AppDomain app in appDomains)
            {
                writer.WriteLine();
                writer.WriteLine($"||{app.FriendlyName}||");
                //assemblies = app.GetAssemblies();
                //writer.WriteLine("-----------------------Assemblies------------------");

                //foreach (Assembly assem in assemblies)
                //{
                //writer.WriteLine(assem.FullName);
                //}

                //writer.WriteLine("---------------------------------------------------");
                //writer.WriteLine();
            }

            return writer.ToString();
        }
    }

 

 

参考:

http://www.cnblogs.com/foman/archive/2009/10/18/1585655.html

http://blog.csdn.net/minsenwu/article/details/38391621

http://www.cnblogs.com/HopeGi/p/6422357.html

http://www.cnblogs.com/awpatp/archive/2009/11/24/1609570.html