100165395.htm

来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 127 行 · 第 1/2 页

HTM
127
字号
<p class="2" style="LINE-HEIGHT: 13pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AppDomain.CurrentDomain.FriendlyName);</span></p>
<p class="2" style="LINE-HEIGHT: 13pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class="a6" style="LINE-HEIGHT: 13pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [STAThread]</span></p>
<p class="a6" style="LINE-HEIGHT: 13pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static void Main(string[] args)</span></p>
<p class="a6" style="LINE-HEIGHT: 13pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p class="2" style="LINE-HEIGHT: 13pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;Main in domain {0} called&quot;,</span></p>
<p class="2" style="LINE-HEIGHT: 13pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AppDomain.CurrentDomain.FriendlyName);</span></p>
<p class="a6" style="LINE-HEIGHT: 13pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class="a6" style="LINE-HEIGHT: 13pt"><span lang="EN-US">&nbsp;&nbsp; }</span></p>
<p class="a6" style="FTEL: 8.15pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">创建的第二个项目也是一个</span><span lang="EN-US">C#</span><span style="FONT-FAMILY: 宋体">控制台应用程序:</span><span lang="EN-US">DomainTest</span><span style="FONT-FAMILY: 宋体">。首先,使用</span><span lang="EN-US">AppDomain</span><span style="FONT-FAMILY: 宋体">类的</span><span lang="EN-US">FriendlyName</span><span style="FONT-FAMILY: 宋体">属性显示当前域的名称。调用</span><span lang="EN-US">CreateDomain()</span><span style="FONT-FAMILY: 宋体">方法,创建一个新的应用程序域&ldquo;</span><span lang="EN-US">New AppDomain</span><span style="FONT-FAMILY: 宋体">&rdquo;,然后把程序集</span><span lang="EN-US">AssemblyA</span><span style="FONT-FAMILY: 宋体">加载到新域中,通过调用</span><span lang="EN-US">ExecuteAssembly()</span><span style="FONT-FAMILY: 宋体">来调用</span><span lang="EN-US">Main()</span><span style="FONT-FAMILY: 宋体">方法:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt"><span lang="EN-US">using System;</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; LINE-HEIGHT: 13pt"><span lang="EN-US">namespace Wrox.ProCSharp.Assemblies.AppDomains</span></p>
<p class="a6" style="LINE-HEIGHT: 13pt"><span lang="EN-US">{</span></p>
<p class="a6" style="LINE-HEIGHT: 13pt"><span lang="EN-US">&nbsp;&nbsp; class Test</span></p>
<p class="a6" style="LINE-HEIGHT: 13pt"><span lang="EN-US">&nbsp;&nbsp; {</span></p>
<p class="a6" style="LINE-HEIGHT: 13pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [STAThread]</span></p>
<p class="a6" style="LINE-HEIGHT: 13pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static void Main(string[] args)</span></p>
<p class="a6" style="LINE-HEIGHT: 13pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p class="2" style="LINE-HEIGHT: 13pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AppDomain currentDomain = AppDomain.CurrentDomain;</span></p>
<p class="2" style="LINE-HEIGHT: 13pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(currentDomain.FriendlyName);</span></p>
<p class="2" style="LINE-HEIGHT: 13pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AppDomain secondDomain = AppDomain.CreateDomain(&quot;New AppDomain&quot;);</span></p>
<p class="2" style="LINE-HEIGHT: 13pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; secondDomain.ExecuteAssembly(&quot;AssemblyA.exe&quot;);</span></p>
<p class="a6" style="LINE-HEIGHT: 13pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class="a6" style="LINE-HEIGHT: 13pt"><span lang="EN-US">&nbsp;&nbsp; }</span></p>
<p class="a6" style="FTEL: 8.15pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17.6pt"><span style="FONT-FAMILY: 宋体">在启动程序</span><span lang="EN-US">DomainTest.exe</span><span style="FONT-FAMILY: 宋体">前,必须把程序集</span><span lang="EN-US">AssemblyA.exe</span><span style="FONT-FAMILY: 宋体">复制到</span><span lang="EN-US">DomainTest.exe</span><span style="FONT-FAMILY: 宋体">所在的目录下,这样程序才能找到这个程序集。不能添加</span><span lang="EN-US">AssemblyA.exe</span><span style="FONT-FAMILY: 宋体">程序集的引用,因为在</span><span lang="EN-US">Visual Studio .NET</span><span style="FONT-FAMILY: 宋体">中,只能给以</span><span lang="EN-US">DLL</span><span style="FONT-FAMILY: 宋体">格式存储的程序集添加引用,不支持</span><span lang="EN-US">EXE</span><span style="FONT-FAMILY: 宋体">格式。但是,</span><span lang="EN-US">EXE</span><span style="FONT-FAMILY: 宋体">格式的程序集可以在命令行上执行。如果找不到这个程序集,就会抛出</span><span lang="EN-US">System.IO.FileNot FoundException</span><span style="FONT-FAMILY: 宋体">异常。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">运行</span><span lang="EN-US">DomainTest.exe</span><span style="FONT-FAMILY: 宋体">程序后,会得到如图</span><span lang="EN-US">13-2</span><span style="FONT-FAMILY: 宋体">所示的控制台输出。</span><span lang="EN-US">DomainTest.exe</span><span style="FONT-FAMILY: 宋体">是第一个应用程序域的名称。第二行是</span><span lang="EN-US">New AppDomain</span><span style="FONT-FAMILY: 宋体">中新加载的程序集的输出结果。在进程浏览器中看不到进程</span><span lang="EN-US">Assembly1.exe</span><span style="FONT-FAMILY: 宋体">的执行,因为没有创建新进程,</span><span lang="EN-US">AssemblyA</span><span style="FONT-FAMILY: 宋体">被加载到过程</span><span lang="EN-US">DomainTest.exe</span><span style="FONT-FAMILY: 宋体">中。</span></p>
<p align="center"><span lang="EN-US"><img height="75" src="13/image002.jpg" width="280" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US">&nbsp; 13-2</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17.6pt"><span style="FONT-FAMILY: 宋体">在新加载的程序集中,还可以再创建一个新实例,以替代调用</span><span lang="EN-US">Main()</span><span style="FONT-FAMILY: 宋体">方法。在下面的例子中,用</span><span lang="EN-US">CreateInstance()</span><span style="FONT-FAMILY: 宋体">替代</span><span lang="EN-US">ExecuteAssembly()</span><span style="FONT-FAMILY: 宋体">方法,它的第一个参数是程序集名</span><span lang="EN-US">AssemblyA</span><span style="FONT-FAMILY: 宋体">,第二个参数定义了应实例化的类</span><span lang="EN-US">Wrox.ProCSharp.Assemblies.AppDomains.Class1</span><span style="FONT-FAMILY: 宋体">,第三个参数</span><span lang="EN-US">true</span><span style="FONT-FAMILY: 宋体">表示不区分大小写。</span><span lang="EN-US">System.Reflection.BindingFlags.CreateInstance</span><span style="FONT-FAMILY: 宋体">是一个绑定标志枚举值,指定应调用的构造函数:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AppDomain secondDomain = AppDomain.CreateDomain(&quot;New AppDomain&quot;);</span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // secondDomain.ExecuteAssembly(&quot;AssemblyA.exe&quot;);</span></p>
<p class="2"><span lang="EN-US">&nbsp;</span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; secondDomain.CreateInstance(&quot;AssemblyA&quot;,</span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Wrox.ProCSharp.Assemblies.AppDomains.Class1&quot;, true,</span></p>
<p class="2"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Reflection.BindingFlags.CreateInstance,</span></p>
<p class="2" style="FTEL: 8.15pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; null, new object[] {7, 3}, null, null, null);</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在应用程序成功运行后,会得到如图</span><span lang="EN-US">13-3</span><span style="FONT-FAMILY: 宋体">所示的控制台输出。</span></p>
<p align="center"><span lang="EN-US" style="FONT-SIZE: 7pt"><img height="85" src="13/image003.jpg" width="377" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US">&nbsp; 13-3</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 17.6pt"><span style="FONT-FAMILY: 宋体">前面介绍了如何创建和调用应用程序域,在运行期间,主应用程序域会自动创建。</span><span lang="EN-US">ASP.NET</span><span style="FONT-FAMILY: 宋体">为每个运行在</span><span lang="EN-US">Web</span><span style="FONT-FAMILY: 宋体">服务器上的</span><span lang="EN-US">Web</span><span style="FONT-FAMILY: 宋体">应用程序创建一个应用程序域。</span><span lang="EN-US">Internet Explorer</span><span style="FONT-FAMILY: 宋体">创建运行托管控件的应用程序域。对于应用程序,如果要卸载一个程序集,创建应用程序域是非常有效的。卸载程序集只能通过中断应用程序域来进行。</span></p></div>
                <!-- page -->
                <div class="page" style="text-align: center">
                    <a href="100165394.htm">上一页</a>&nbsp;&nbsp;&nbsp;<a href="index.html">首页</a>&nbsp;&nbsp;&nbsp;<a href="100165396.htm">下一页</a>
                </div>
              
                <div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
                    <div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
                        图书导读
                    </div>
                    <div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
                        <!--导读-->
                        <h1 id="divCurrentNode2" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165395.htm'><font color='red'>13.1.3  应用程序域和程序集</font></a></h1>
                        <div id="divRealteNod2" style="padding-left: 2px">
                        <div style='float:left;width:49%'>·<a href='100165392.htm'>13.1  程序集的含义</a></div><div style='float:right;width:49%'>·<a href='100165393.htm'>13.1.1  DLL-Hell的解决方案</a></div><div style='float:left;width:49%'>·<a href='100165394.htm'>13.1.2  程序集的特性</a></div><div style='float:right;width:49%'>·<a href='100165396.htm'>13.2  程序集的结构</a></div><div style='float:left;width:49%'>·<a href='100165397.htm'>13.2.1  程序集的清单</a></div><div style='float:right;width:49%'>·<a href='100165398.htm'>13.2.2  命名空间、程序集和组件</a></div></div>
                    </div>
                </div>
                </div></div>
   
</body>
</html>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?