创建自定义AppDomain并向其添加程序集
如何创建appdomain,向其添加程序集,然后销毁该app域? 这是我尝试过的:
static void Main(string[] args) { string pathToExe = @"A:UsersTonoDesktopConsoleApplication1.exe"; AppDomain myDomain = AppDomain.CreateDomain("MyDomain"); Assembly a = Assembly.Load(System.IO.File.ReadAllBytes(pathToExe)); myDomain.Load(a.FullName); // Crashes here! }
我也尝试过:
myDomain.Load(File.ReadAllBytes(pathToExe));
如何将程序集添加到appdomain。 一旦我这样做,我可以通过reflection找到方法执行它,然后销毁appdomain
我得到的例外是:
无法加载文件或程序集“ConsoleApplication1,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null”或其依赖项之一。 该系统找不到指定的文件。
两个快点:
-
AppDomain.Load
在当前AppDomain.Load
加载程序集而不在myDomain
上加载(很奇怪,我知道)。 -
AppDomain.Load
在Load
上下文中加载程序集,该上下文解析来自apps base-dir,private-bin-paths和GAC的程序集。 最有可能的是,您尝试加载的程序集不在任何这些解释exception消息的位置。
有关详细信息,请查看此答案 。
将程序集加载到AppDomain的一种方法是创建MarshalByRef派生的加载程序。 您需要这样的东西,以避免泄漏类型(和程序集)到您的主AppDomain。 这是一个简单的:
public class SimpleAssemblyLoader : MarshalByRefObject { public void Load(string path) { ValidatePath(path); Assembly.Load(path); } public void LoadFrom(string path) { ValidatePath(path); Assembly.LoadFrom(path); } private void ValidatePath(string path) { if (path == null) throw new ArgumentNullException("path"); if (!System.IO.File.Exists(path)) throw new ArgumentException(String.Format("path "{0}" does not exist", path)); } }
并使用它:
上述就是C#学习教程:创建自定义AppDomain并向其添加程序集分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
//Create the loader (a proxy). var assemblyLoader = (SimpleAssemblyLoader)myDomain.CreateInstanceAndUnwrap(typeof(SimpleAssemblyLoader).Assembly.FullName, typeof(SimpleAssemblyLoader).FullName); //Load an assembly in the LoadFrom context. Note that the Load context will //not work unless you correctly set the AppDomain base-dir and private-bin-paths. assemblyLoader.LoadFrom(pathToExe); //Do whatever you want to do. //Finally unload the AppDomain. AppDomain.Unload(myDomain);
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/985740.html