在另一个应用程序域中执行代码(C# 编程指南)<!---->
<!--Content type: DocStudio. Transform: devdiv2mtps.xslt.-->
一旦将程序集加载到应用程序域中,就可以执行该程序集所包含的代码。最简单的加载方法是使用 AssemblyLoad,它会将程序集加载到当前应用程序域中,并从程序集的默认入口点开始运行代码。
如果希望将该程序集加载到另外一个应用程序域中,可以使用 ExecuteAssembly 或 ExecuteAssemblyByName,或者使用这些方法的其他重载版本之一。
如果想从默认入口点以外的位置执行另一个程序集,可在远程程序集中定义一个从 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();
}
分享到:
相关推荐
程序还是每个应用程序域的基础上为字符串计算哈希代码,以及 AppContextSwitchOverrides 元素允许库用户选择或拒绝使用由库提供的更改功能。 <运行时>部分中的元素在应用程序启动时由公共语言运行时自动读取。 还可...
果不采用进程间通信(RPC)机制,则在一个进程中执行的代码就不能访问另一进程。这是 一种操作系统对应用程序的保护机制。然而在某些情况下,我们需要跨过应用程序域,与另 外的应用程序域进行通信,即穿越边界。
如果不采用进程间通信(RPC)机制,则在一个进程中执行的代码就不能访问另一进程。这是一种操作系统对应用程序的保护机制。然而在某些情况下,我们需要跨过应用程序域,与另外的应用程序域进行通信,即穿越边界。 在...
ASP.NET单文件页模型在创建并生成时,开发人员编写的类将编译成程序集,并将该程序集加载到应用程序域,并对该页的类进行实例化后输出到浏览器。可以说,.aspx页面的代码也即将会生成一个类,并包含内部逻辑。在...
43.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 答:会执行,在return前执行。 44.两个对象值相同(x.equals(y) == true),但却可有不同...
数据库、对象的链接和嵌入、多媒体控件以及常用的 ActiveX 控件的应用,最后介绍了打字练习、画板、学生成绩管理系统等应用程序实例。本书配有大量的实例和测试题,并配有 CAI课件、电子教案。本书由浅入深、通俗...
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 ...
第三章 编写第一个应用程序 .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()方法保证应用程序域等待异步程序结束后才终止运行。...
·分享c++程序的错误查找技术,并介绍通用的调试原则讨论每一个windows应用程序的结构和基本元素 ·举例说明如何使用mfc开发本地windows应用程序 ·指导读者用c++和c++/cli设计和创建大量的windows应用程序 ...
先创建ThreadStart代理,指定要由该线程执行的线程函数,然后将ThreadStart代理传递给Thread类的构造函数,调用Thread类的Start方法启动新的线程然后调用Join()方法保证应用程序域等待异步程序结束后才终止运行。...
如果我在我编写的应用程序中发现一个错误,我可能想要向用户显示该错误的文本描述。Windows提供了一个函数,可以将错误代码转换成它的文本描述。该函数称为FormatMessage。请看下面的代码: 见原书P8的程序(1) ...
3.2.5 在控制台应用程序中添加模块并调试执行 3.3 创建窗体应用程序 3.4 打印程序代码 本章重点整理 本章习题 第4章 基本数据处理 4.1 变量与数据类型 4.1.1 变量与常量 4.1.2 数据类型 4.2 变量与常量声明 4.2.1 ...
25.下面是一个java应用程序(Application),它的功能是在屏幕上输出26个小写英文字母,其中每个字母相隔一个制表符,请完成程序填空。 public _____ Class1 { public static void main( String args[] ) { char...
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 ...
3.2.5 在控制台应用程序中添加模块并调试执行 3.3 创建窗体应用程序 3.4 打印程序代码 本章重点整理 本章习题 第4章 基本数据处理 4.1 变量与数据类型 4.1.1 变量与常量 4.1.2 数据类型 4.2 变量与常量声明 4.2.1 ...
智慧化简单来说是一个以机器替换人力的过程,而机器的“灵魂”是程序。Python已经成为公认的驱动大数据智能应用的主流编程语言。Python程序设计的书籍已经琳琅满目,每一本书都凝聚了作者对Python的理解和对程序设计...
对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。 Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless ...
在其他应用程序域中执行程序代码 459 建立和使用应用程序域 461 组件和全局程序集缓存 461 Friend 组件 462 判断档案是否为组件 465 加载和卸除组件 466 与其他应用程序共享程序集 466 使用属性 468 明示属性目标 ...