`
justdoithz
  • 浏览: 48624 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

在另一个应用程序域中执行代码

阅读更多
在另一个应用程序域中执行代码(C# 编程指南)<!---->
<!--Content type: DocStudio. Transform: devdiv2mtps.xslt.-->

一旦将程序集加载到应用程序域中,就可以执行该程序集所包含的代码。最简单的加载方法是使用 AssemblyLoad,它会将程序集加载到当前应用程序域中,并从程序集的默认入口点开始运行代码。

如果希望将该程序集加载到另外一个应用程序域中,可以使用 ExecuteAssemblyExecuteAssemblyByName,或者使用这些方法的其他重载版本之一。

如果想从默认入口点以外的位置执行另一个程序集,可在远程程序集中定义一个从 MarshalByRefObject 派生的新类型。然后在应用程序中使用 CreateInstance 创建该类型的一个实例。

请考虑下面的文件,它创建一个包含一个命名空间和两个类的程序集。假设此程序集已经生成,并以 HelloWorldRemote.exe 为名存储在驱动器 C 上。

// This namespace contains code to be called.
namespace HelloWorldRemote
{
    public class RemoteObject : System.MarshalByRefObject
    {
        public RemoteObject()
        {
            System.Console.WriteLine("Hello, World! (RemoteObject Constructor)");
        }
    }
    class Program
    {
        static void Main()
        {
            System.Console.WriteLine("Hello, World! (Main method)");
        }
    }
}

为了从其他应用程序访问该代码,可以将该程序集加载到当前应用程序域中,或创建新的应用程序域并将该程序集加载到其中。如果使用 Assembly.LoadFrom 将程序集加载到当前应用程序域中,您可以使用 Assembly.CreateInstance 来实例化 RemoteObject 类的实例,这样将导致执行对象构造函数。

static void Main()
{
    // Load the assembly into the current appdomain:
    System.Reflection.Assembly newAssembly = System.Reflection.Assembly.LoadFrom(@"c:\HelloWorldRemote.exe");

    // Instantiate RemoteObject:
    newAssembly.CreateInstance("HelloWorldRemote.RemoteObject");
}

将程序集加载到一个单独的应用程序域时,应使用 AppDomain.ExecuteAssembly 来访问默认入口点,或使用 AppDomain.CreateInstance 创建 RemoteObject 类的实例。创建该实例将导致执行构造函数。

static void Main()
{
    System.AppDomain NewAppDomain = System.AppDomain.CreateDomain("NewApplicationDomain");

    // Load the assembly and call the default entry point:
    NewAppDomain.ExecuteAssembly(@"c:\HelloWorldRemote.exe");

    // Create an instance of RemoteObject:
    NewAppDomain.CreateInstanceFrom(@"c:\HelloWorldRemote.exe", "HelloWorldRemote.RemoteObject");
}

如果不想以编程方式加载程序集,可以从“解决方案资源管理器”中使用“添加引用”来指定程序集 HelloWorldRemote.exe。然后向应用程序的 using 块中添加一个 using HelloWorldRemote; 指令,并在程序中使用 RemoteObject 类型来声明 RemoteObject 对象的一个实例,如下所示:

static void Main()
{
    // This code creates an instance of RemoteObject, assuming HelloWorldRemote has been added as a reference:
    HelloWorldRemote.RemoteObject o = new HelloWorldRemote.RemoteObject();
}
分享到:
评论

相关推荐

    C#应用程序配置说明书

    程序还是每个应用程序域的基础上为字符串计算哈希代码,以及 AppContextSwitchOverrides 元素允许库用户选择或拒绝使用由库提供的更改功能。 &lt;运行时&gt;部分中的元素在应用程序启动时由公共语言运行时自动读取。 还可...

    细细品味C#(Remoting专题)

    果不采用进程间通信(RPC)机制,则在一个进程中执行的代码就不能访问另一进程。这是 一种操作系统对应用程序的保护机制。然而在某些情况下,我们需要跨过应用程序域,与另 外的应用程序域进行通信,即穿越边界。

    15套 c# 操作 Remoting 的源代码事例,相信对你有用!

    如果不采用进程间通信(RPC)机制,则在一个进程中执行的代码就不能访问另一进程。这是一种操作系统对应用程序的保护机制。然而在某些情况下,我们需要跨过应用程序域,与另外的应用程序域进行通信,即穿越边界。 在...

    ASP.NET的网页代码模型及生命周期

    ASP.NET单文件页模型在创建并生成时,开发人员编写的类将编译成程序集,并将该程序集加载到应用程序域,并对该页的类进行实例化后输出到浏览器。可以说,.aspx页面的代码也即将会生成一个类,并包含内部逻辑。在...

    net学习笔记及其他代码应用

    43.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 答:会执行,在return前执行。 44.两个对象值相同(x.equals(y) == true),但却可有不同...

    VB程序设计及应用

    数据库、对象的链接和嵌入、多媒体控件以及常用的 ActiveX 控件的应用,最后介绍了打字练习、画板、学生成绩管理系统等应用程序实例。本书配有大量的实例和测试题,并配有 CAI课件、电子教案。本书由浅入深、通俗...

    Powerbuilder9.0实用教程源代码

    5.7.1 新建一个工作空间和应用程序对象 167 5.7.2 创建主窗体 167 5.7.3 为应用程序的open事件添加脚本语句 168 5.8 小结 169 5.9 习题 169 第6章 创建窗体 170 6.1 创建常用窗体 170 6.1.1 创建主窗体 170 ...

    C#微软培训资料

    第三章 编写第一个应用程序 .20 3.1 Welcome 程序 .20 3.2 代 码 分 析 .20 3.3 运 行 程 序 .23 .4 添 加 注 释 .25 3.5 小 结 .27 第二部分 C#程序设计基础.28 第四章 数 据 类 型 .28 4.1 值 类 型...

    并行计算课程设计(代码+执行文件+文档)

    先创建ThreadStart代理,指定要由该线程执行的线程函数,然后将ThreadStart代理传递给Thread类的构造函数,调用Thread类的Start方法启动新的线程然后调用Join()方法保证应用程序域等待异步程序结束后才终止运行。...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

     ·分享c++程序的错误查找技术,并介绍通用的调试原则讨论每一个windows应用程序的结构和基本元素  ·举例说明如何使用mfc开发本地windows应用程序  ·指导读者用c++和c++/cli设计和创建大量的windows应用程序 ...

    并行计算课程设计(报告+代码+可执行文件)

    先创建ThreadStart代理,指定要由该线程执行的线程函数,然后将ThreadStart代理传递给Thread类的构造函数,调用Thread类的Start方法启动新的线程然后调用Join()方法保证应用程序域等待异步程序结束后才终止运行。...

    VC++6.0核心编程源码.rar

    如果我在我编写的应用程序中发现一个错误,我可能想要向用户显示该错误的文本描述。Windows提供了一个函数,可以将错误代码转换成它的文本描述。该函数称为FormatMessage。请看下面的代码: 见原书P8的程序(1) ...

    Visual Basic 2008程序设计完全自学教程 1/2

    3.2.5 在控制台应用程序中添加模块并调试执行 3.3 创建窗体应用程序 3.4 打印程序代码 本章重点整理 本章习题 第4章 基本数据处理 4.1 变量与数据类型 4.1.1 变量与常量 4.1.2 数据类型 4.2 变量与常量声明 4.2.1 ...

    java综合试题(面试题)

    25.下面是一个java应用程序(Application),它的功能是在屏幕上输出26个小写英文字母,其中每个字母相隔一个制表符,请完成程序填空。 public _____ Class1 { public static void main( String args[] ) { char...

    Visual C++ 2005入门经典--源代码及课后练习答案

    1.6.6 创建和执行Windows应用程序 24 1.6.7 创建Windows Forms应用程序 26 1.7 小结 29 第2章 数据、变量和计算 31 2.1 C++程序结构 31 2.1.1 程序注释 36 2.1.2 #include指令——头文件 37 2.1.3 ...

    Visual Basic 2008程序设计完全自学教程 2/2

    3.2.5 在控制台应用程序中添加模块并调试执行 3.3 创建窗体应用程序 3.4 打印程序代码 本章重点整理 本章习题 第4章 基本数据处理 4.1 变量与数据类型 4.1.1 变量与常量 4.1.2 数据类型 4.2 变量与常量声明 4.2.1 ...

    Python语言程序设计习题答案.zip

    智慧化简单来说是一个以机器替换人力的过程,而机器的“灵魂”是程序。Python已经成为公认的驱动大数据智能应用的主流编程语言。Python程序设计的书籍已经琳琅满目,每一本书都凝聚了作者对Python的理解和对程序设计...

    超级有影响力霸气的Java面试题大全文档

     对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。  Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless ...

    C# 程序设计手册(WORD)

    在其他应用程序域中执行程序代码 459 建立和使用应用程序域 461 组件和全局程序集缓存 461 Friend 组件 462 判断档案是否为组件 465 加载和卸除组件 466 与其他应用程序共享程序集 466 使用属性 468 明示属性目标 ...

Global site tag (gtag.js) - Google Analytics