在另一个应用程序域中执行代码
2009-01-07 21:44
99 查看
在另一个应用程序域中执行代码(C# 编程指南)
一旦将程序集加载到应用程序域中,就可以执行该程序集所包含的代码。最简单的加载方法是使用 AssemblyLoad,它会将程序集加载到当前应用程序域中,并从程序集的默认入口点开始运行代码。
如果希望将该程序集加载到另外一个应用程序域中,可以使用 ExecuteAssembly 或 ExecuteAssemblyByName,或者使用这些方法的其他重载版本之一。
如果想从默认入口点以外的位置执行另一个程序集,可在远程程序集中定义一个从 MarshalByRefObject 派生的新类型。然后在应用程序中使用 CreateInstance 创建该类型的一个实例。
请考虑下面的文件,它创建一个包含一个命名空间和两个类的程序集。假设此程序集已经生成,并以 HelloWorldRemote.exe 为名存储在驱动器 C 上。
C#
复制代码
为了从其他应用程序访问该代码,可以将该程序集加载到当前应用程序域中,或创建新的应用程序域并将该程序集加载到其中。如果使用 Assembly.LoadFrom 将程序集加载到当前应用程序域中,您可以使用 Assembly.CreateInstance 来实例化 RemoteObject 类的实例,这样将导致执行对象构造函数。
C#
复制代码
将程序集加载到一个单独的应用程序域时,应使用 AppDomain.ExecuteAssembly 来访问默认入口点,或使用 AppDomain.CreateInstance 创建 RemoteObject 类的实例。创建该实例将导致执行构造函数。
C#
复制代码
如果不想以编程方式加载程序集,可以从“解决方案资源管理器”中使用“添加引用”来指定程序集 HelloWorldRemote.exe。然后向应用程序的 using 块中添加一个 using HelloWorldRemote; 指令,并在程序中使用 RemoteObject 类型来声明 RemoteObject 对象的一个实例,如下所示:
C#
复制代码
一旦将程序集加载到应用程序域中,就可以执行该程序集所包含的代码。最简单的加载方法是使用 AssemblyLoad,它会将程序集加载到当前应用程序域中,并从程序集的默认入口点开始运行代码。
如果希望将该程序集加载到另外一个应用程序域中,可以使用 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)"); } } }
为了从其他应用程序访问该代码,可以将该程序集加载到当前应用程序域中,或创建新的应用程序域并将该程序集加载到其中。如果使用 Assembly.LoadFrom 将程序集加载到当前应用程序域中,您可以使用 Assembly.CreateInstance 来实例化 RemoteObject 类的实例,这样将导致执行对象构造函数。
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"); }
将程序集加载到一个单独的应用程序域时,应使用 AppDomain.ExecuteAssembly 来访问默认入口点,或使用 AppDomain.CreateInstance 创建 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"); }
如果不想以编程方式加载程序集,可以从“解决方案资源管理器”中使用“添加引用”来指定程序集 HelloWorldRemote.exe。然后向应用程序的 using 块中添加一个 using HelloWorldRemote; 指令,并在程序中使用 RemoteObject 类型来声明 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(); }
相关文章推荐
- 在另一个应用程序域中执行代码(C# 编程指南)
- VS2010 : 正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。
- 如何在代码中执行应用程序安全性检查(声明式和代码式)
- 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起
- [C# FAQ]C#代码中如何启动另一个应用程序或批处理程序?
- 正试图在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。
- 正尝试在 OS 载入程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内执行托管代码,这样做会导致应用程序挂起。
- 如何让asp.net应用程序定时自动执行代码
- 如果想让应用程序进入后台之后继续执行代码,应该怎么办?
- 如何用C#动态编译应用程序来执行自定义代码
- Zend Optimizer用优化代码的方法来提高php应用程序的执行速度
- 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起
- 应用程序按照以下顺序执行由 global.asax 文件中定义的模块或用户代码处理的事件
- ArcGis :正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。
- 在指定应用程序域中执行代码
- S3C2440启动代码中应用程序执行环境的初始化
- 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起.
- 如何在代码中执行应用程序安全性检查(声明式和代码式)
- C R E AT E S U S P E N D E D标志使得应用程序能够在它有机会执行任何代码之前修改线程的某 些属性
- 在AE二次开发中出“正试图在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。”异常解决方案