在另一个应用程序域中执行代码(C# 编程指南)
2010-01-05 17:04
281 查看
一旦将程序集加载到应用程序域中,就可以执行该程序集所包含的代码。最简单的加载方法是使用 AssemblyLoad,它会将程序集加载到当前应用程序域中,并从程序集的默认入口点开始运行代码。
如果希望将该程序集加载到另外一个应用程序域中,可以使用 ExecuteAssembly 或 ExecuteAssemblyByName,或者使用这些方法的其他重载版本之一。
如果想从默认入口点以外的位置执行另一个程序集,可在远程程序集中定义一个从 MarshalByRefObject 派生的新类型。然后在应用程序中使用 CreateInstance 创建该类型的一个实例。
请考虑下面的文件,它创建一个包含一个命名空间和两个类的程序集。假设此程序集已经生成,并以 HelloWorldRemote.exe 为名存储在驱动器 C 上。
为了从其他应用程序访问该代码,可以将该程序集加载到当前应用程序域中,或创建新的应用程序域并将该程序集加载到其中。如果使用 Assembly.LoadFrom 将程序集加载到当前应用程序域中,您可以使用 Assembly.CreateInstance 来实例化 RemoteObject 类的实例,这样将导致执行对象构造函数。
将程序集加载到一个单独的应用程序域时,应使用 AppDomain.ExecuteAssembly 来访问默认入口点,或使用 AppDomain.CreateInstance 创建 RemoteObject 类的实例。创建该实例将导致执行构造函数。
如果不想以编程方式加载程序集,可以从“解决方案资源管理器”中使用“添加引用”来指定程序集 HelloWorldRemote.exe。然后向应用程序的 using 块中添加一个 using HelloWorldRemote; 指令,并在程序中使用 RemoteObject 类型来声明 RemoteObject 对象的一个实例,如下所示:
如果希望将该程序集加载到另外一个应用程序域中,可以使用 ExecuteAssembly 或 ExecuteAssemblyByName,或者使用这些方法的其他重载版本之一。
如果想从默认入口点以外的位置执行另一个程序集,可在远程程序集中定义一个从 MarshalByRefObject 派生的新类型。然后在应用程序中使用 CreateInstance 创建该类型的一个实例。
请考虑下面的文件,它创建一个包含一个命名空间和两个类的程序集。假设此程序集已经生成,并以 HelloWorldRemote.exe 为名存储在驱动器 C 上。
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)"); } } } |
C# | 复制代码 |
---|---|
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"); } |
C# | 复制代码 |
---|---|
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"); } |
C# | 复制代码 |
---|---|
static void Main() { // This code creates an instance of RemoteObject, assuming HelloWorldRemote has been added as a reference: HelloWorldRemote.RemoteObject o = new HelloWorldRemote.RemoteObject(); } |
相关文章推荐
- default 关键字泛型代码中的默认关键字(C# 编程指南)
- c#编程指南(十六) 连续两周出现在CodeProject Newsletter上代码分析
- 如何用C#动态编译应用程序来执行自定义代码
- C# 一个按钮执行另一个按钮的代码
- 泛型代码中的默认关键字(C# 编程指南)
- 在另一个应用程序域中执行代码
- [C# FAQ]C#代码中如何启动另一个应用程序或批处理程序?
- 分部类定义(C# 编程指南)
- C#代码执行时,使Dos窗口一直保持可见的方法
- 索引器(C# 编程指南)
- c#代码编程风格很实用
- 初读MSDN C#编程指南有感
- C#和Java 网络编程实例核心代码
- MSDN精选:Lambda 表达式(C# 编程指南)
- Lambda 表达式(C# 编程指南)
- Lambda 表达式(C# 编程指南)
- 在C#中调用另一个应用程序或命令行(.exe 带参数)<zz>
- 扩展方法(C# 编程指南)
- c#开发的应用程序做退出程序的代码
- 希望应用程序关闭时执行某些代码,可以使用DomainUnload\ProcessExit 事件