Tag: appdomain

AppDomain卸载杀死父AppDomain

我无法弄清楚我的AppDomain.Unload(…)调用。 我从前面的问题中得到了代码的详细解释。 事实certificate,我执行了几个步骤,显然,我不需要。 但是,我很确定在创建AppDomain并将其保存在集合中时: private static Dictionary HostDomains; void StartNewDomain(string domainName) { AppDomain domain = AppDomain.CreateDomain(domainName); HostDomains[domainName] = domain; } ……当你完成它之后,你必须卸载它: if (HostDomains.ContainsKey(domainName)) { AppDomain.Unload(HostDomains[domainName]); HostDomains.Remove(domainName); } 然后从集合中删除域。 但是,当我卸载域时,整个应用程序正在结束。 如果我删除卸载,一切都很好……我们只是从集合中删除域。 但我担心我的孩子AppDomain并没有真正卸载。 它可能最终得到GC我猜,但这并没有给我一个温暖的模糊。 子AppDomain程序集(Windows窗体应用程序)通过我的适配器类中引用的接口(IModule)异步启动,该接口inheritanceMarshalByRefObject 。 我想知道这个对IModule的Start()(插件模块程序集实现的)的引用是不是正确编组(因为我的实现)。 因此,当调用Shutdown()方法时,整个应用程序都会死掉。 我应该让我的IModule成为一个抽象类,所以它应该inheritanceMBR吗? 困惑… 看了我的代码后: // instances the module for access to the module’s Start() method IModule module = (IModule)domain.CreateInstanceAndUnwrap( ModuleManager.Modules[modName].Name, […]

将不同版本的程序集加载到单独的AppDomain中

我正在实现支持插件的应用程序。 目前,当我尝试加载主机应用程序和插件使用的公共程序集时,问题就出现了:主机应用程序应该使用该程序集的一个版本,而插件使用另一个版本。 这取决于应用程序升级过程 – 插件可以与主机应用程序分开更新。 每个程序集都是签名的,因此我使用强名称来加载程序集。 我创建了一个测试应用程序来演示问题。 插件程序集位于主机应用程序的子文件夹“插件”中。 插件文件夹包含插件实现DLL,插件声明接口DLL和CommonLib DLL。 主机应用程序还使用插件声明DLL和CommonLib DLL(位于文件夹树中的1级)。 这是插件加载的源代码: static void Main(string[] args) { Console.WriteLine(“Host says: {0}”, GreetingManager.SayHello(“Sasha”)); Console.WriteLine(“Host says: {0}”, GreetingManager.SayGoodBye(“Sasha”)); var pluginDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, “Plugin”); var pluginFile = Directory.GetFiles(pluginDir).First(f => f.EndsWith(“Plugin.dll”)); Assembly asmr = Assembly.ReflectionOnlyLoadFrom(pluginFile); AppDomain pluginDomain = AppDomain.CreateDomain(“Plugin”, null, pluginDir, “”, false); pluginDomain.Load(asmr.FullName); Assembly asm = pluginDomain.GetAssemblies().First(a => […]

CreateInstanceAndUnwrap和Domain

我有一个属性,其实例我想在其他域中。 public ModuleLoader Loader { get { if(_loader == null) _loader = (ModuleLoader)myDomain.CreateInstanceAndUnwrap( this.GetType().Assembly.FullName, “ModuleLoader”, false, System.Reflection.BindingFlags.CreateInstance, null, null, null, null); System.Diagnostics.Debug.WriteLine(“Is proxy={0}”, RemotingServices.IsTransparentProxy(_loader)); //writes false _loader.Session = this; return _loader; } } 这很好用。 但我假设_loader实例上的所有方法调用都将在其他域(myDomain)中调用。 但是当我运行以下代码时,它仍然会编写主应用程序域。 public void LoadModule(string moduleAssembly) { System.Diagnostics.Debug.WriteLine(“Is proxy={0}”, RemotingServices.IsTransparentProxy(this)); System.Diagnostics.Debug.WriteLine( AppDomain.CurrentDomain.FriendlyName); System.Diagnostics.Debug.WriteLine(“———–“); } 是因为Unwrap()? 我在哪里做错了? 我知道AppDomain会创建单独的内存。 我需要的是我的主应用程序运行,它在不同的AppDomain中加载模块。 由于主应用程序还希望观看模块的一些活动以及与在单独域中运行的对象进行交互,因此实现它的最佳方法是什么。

如何在单独的AppDomain中托管IronPython引擎?

我试过了明显的事: var appDomain = AppDomain.CreateDomain(“New Domain”); var engine = IronPython.Hosting.Python.CreateEngine(appDomain); // boom! 但我收到以下错误消息: 成员’Microsoft.Scripting.Hosting.ScriptRuntimeSetup,Microsoft.Scripting,Version = 0.9.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35’的类型未解析。 谷歌搜索这个错误并没有certificate是富有成效的… 编辑#1: 我试图通过将相关的东西复制到新的控制台应用程序来创建一个最小的复制项目: using System; using Microsoft.Scripting; namespace PythonHostSamle { class Program { static void Main(string[] args) { AppDomain sandbox = AppDomain.CreateDomain(“sandbox”); var engine = IronPython.Hosting.Python.CreateEngine(sandbox); var searchPaths = engine.GetSearchPaths(); searchPaths.Add(@”C:\Python25\Lib”); searchPaths.Add(@”C:\RevitPythonShell”); engine.SetSearchPaths(searchPaths); var scope […]

限制插件汇编代码访问

我想创建一个插件架构,我可以将程序集API限制为非常有限的内容,即只允许函数白名单。 是否可以限制插件组件可以调用的function/方法? 我可以使用AppDomains吗? 有没有人有一个简单的例子?

AppDomain.CreateInstanceFromAndUnwrap – 无法转换透明代理

我正在编写一个.NET库,将托管DLL注入外部进程。 我目前的做法是: 使用CreateRemoteThread强制目标进程在非托管引导DLL上调用LoadLibrary 。 从这一点开始,我们在目标进程中执行代码。 我的引导DLL然后创建一个CLR实例并在其上调用ExecuteInDefaultAppDomain ,它执行托管助手DLL中的方法。 此方法创建一个新的AppDomain并调用AppDomain.CreateInstanceFromAndUnwrap将执行传递到我的有效负载DLL,并将结果转换为IInjectionPayload 。 我的想法是我的有效负载DLL公开了一个实现IInjectionPayload的类,因此助手DLL可以简单地调用payload.Run() 。 我这样做是为了通过简单地调用AppDomain.Unload (在发信号通知清理之后)完全卸载有效负载代码。 这种方法有效 – 我的有效负载DLL中的类正在目标进程中实例化,因此可以执行代码 – 但是我无法将CreateInstanceFromAndUnwrap返回的对象IInjectionPayload转换为IInjectionPayload ; 它抛出以下exception: 无法转换透明代理以键入’blah.Blah.IInjectionPayload’。 我尝试使用CreateInstanceAndUnwrap和Activator.CreateInstanceFrom后跟Object.Unwrap ,但这两种方法也会导致抛出相同的exception。 我的有效载荷类的签名是: public class Program : MarshalByRefObject, IInjectionPayload 我很难过,因为有效负载DLL肯定会被加载,并且正在按照预期实例化类。 任何帮助将非常感激。

通过文件共享,用户身份validation通过网络复制文件

我正在构建.net C#控制台程序,以将文件部署到Windows文件共享服务器(正在共享的文件夹)。 路径是:: \\192.168.0.76\htdocs\public 在运行时我收到错误: [09:35:29]: [Step 1/3] Unhandled Exception: System.UnauthorizedAccessException: Access to the path ‘\\192.168.0.76\htdocs\public’ is denied. [09:35:29]: [Step 1/3] at DeployFileShare.Program.CopyDir(String source, String dest, String[] exclude, Boolean overwrite) [09:35:29]: [Step 1/3] at DeployFileShare.Program.Deploy(String num, String source) [09:35:29]: [Step 1/3] at DeployFileShare.Program.Main(String[] args) [09:35:29]: [Step 1/3] Process exited with code -532459699 我想我需要对自己进行身份validation。 我遇到过这个: AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); […]

如何在运行,加载和使用中编译C#DLL

A)动态编译C#EXE和DLL是相对容易的。 B)执行EXE意味着运行新的应用程序。 加载DLL意味着可以在可以在应用程序或项目之间共享的情况下使用方法和函数。 现在,可以从MSDN或为方便起见,找到编译EXE(或使用温和修改,DLL)的最快最简单的方法: private bool CompileCSharpCode(string script) { lvErrors.Items.Clear(); try { CSharpCodeProvider provider = new CSharpCodeProvider(); // Build the parameters for source compilation. CompilerParameters cp = new CompilerParameters { GenerateInMemory = false, GenerateExecutable = false, // True = EXE, False = DLL IncludeDebugInformation = true, OutputAssembly = “eventHandler.dll”, // Compilation name }; // Add […]

在New AppDomain中加载程序集而不将其加载到Parent AppDomain中

我试图将一个DLL加载到控制台应用程序,然后卸载它并完全删除该文件。 我遇到的问题是,在自己的AppDomain中加载dll的行为会在Parent AppDomain中创建一个引用,因此不允许我销毁dll文件,除非我完全关闭程序。 有关使此代码有效的任何想法? string fileLocation = @”C:\Collector.dll”; AppDomain domain = AppDomain.CreateDomain(fileLocation); domain.Load(@”Services.Collector”); AppDomain.Unload(domain); 顺便说一下,我也尝试过这段代码而且没有运气 string fileLocation = @”C:\Collector.dll”; byte[] assemblyFileBuffer = File.ReadAllBytes(fileLocation); AppDomainSetup domainSetup = new AppDomainSetup(); domainSetup.ApplicationBase = Environment.CurrentDirectory; domainSetup.ShadowCopyFiles = “true”; domainSetup.CachePath = Environment.CurrentDirectory; AppDomain tempAppDomain = AppDomain.CreateDomain(“Services.Collector”, AppDomain.CurrentDomain.Evidence, domainSetup); //Load up the temp assembly and do stuff Assembly projectAssembly = tempAppDomain.Load(assemblyFileBuffer); […]

以编程方式查找ASP.NET工作进程和应用程序域上次启动的时间?

在ASP.NET中: 如何判断ASP.NET工作进程上次重新启动的时间? 在ASP.NET中,如何判断应用程序域上次回收的时间?