C# 当从一个单独的应用程序域调用方法时,什么会导致缓慢?
我设置了一个AppDomain,让IronPython在其中运行:C# 当从一个单独的应用程序域调用方法时,什么会导致缓慢?,c#,ironpython,appdomain,C#,Ironpython,Appdomain,我设置了一个AppDomain,让IronPython在其中运行: var appDomainSetup = new AppDomainSetup { ApplicationBase = sandboxPath }; var sandbox = AppDomain.CreateDomain("Sandbox", evidence, appDomainSetup, permissionSet); 将sandboxPath设置为我的exe目录时,脚本发出的调用会很快。如果将sandboxPath设
var appDomainSetup = new AppDomainSetup { ApplicationBase = sandboxPath };
var sandbox = AppDomain.CreateDomain("Sandbox", evidence, appDomainSetup, permissionSet);
将sandboxPath设置为我的exe目录时,脚本发出的调用会很快。如果将sandboxPath设置为包含脚本要调用的所有必需DLL类和相关IronPython DLL的文件夹,则脚本的调用会很慢。请务必注意,这些调用正在从我的主AppDomain跨越到我的沙盒AppDomain。由于我对IronPython的工作原理缺乏了解,本期文章提出了许多问题,而我的研究也使我进入了几个圈子。我的主要问题是IronPython如何以及何时加载程序集,以及让它使用单独的目录作为基础会如何降低性能
程序集是否在AppDomain构造时加载?在哪里可以阅读AppDomain如何加载程序集和程序集加载器
提到设置ApplicationBase属性确定程序集加载器开始探测要加载到新应用程序域的程序集的位置。
当我用一个新的AppDomain调用Python.CreateEngine时,到底发生了什么
我看到它创建了一个脚本运行时。如果我预装了程序集,性能上的损失可能会消失?或者设置基是否已在基目录中预加载程序集?
最后,假设我在Types.dll中有一些可以跨AppDomains共享的类TypeA,还有一些字典类,我在其中存储了一些TypeA。这些类型是从事物的C端设置的,作为Main.proj的一部分。此存储类有一个代理作用域值类,因此IronPython脚本可以访问它。此作用域值位于Sandbox.proj中。通过上面单独的目录设置,我实际上有两种类型的.dll,一种在我的exe目录中,另一种在我的沙盒目录中。构建C项目是为了引用exe目录中的项目,而我假设IronPython正在引用其ApplicationBase目录中的项目。为什么这不是一个问题?这是一个潜在的问题吗?我知道这个问题很容易解决,但我不明白为什么它会起作用。总结:我将两个相同的DLL加载到两个单独的AppDomain中,它们通过在这些DLL中传递一个类来相互通信,但实际上它不是同一个类
依赖项:
Main.proj -> Types.dll // to set the TypeAs read from a file or network
Sandbox.proj -> Types.dll // to read in the scripts
文件夹结构:
bin/Main.exe
bin/Types.dll
bin/Sandbox/Sandbox.dll
bin/Sandbox/Types.dll
欢迎提供任何帮助和意见。您是否使用远程处理对其他应用程序域进行调用?这些调用是在同一台计算机上以相同的过程进行的。这已证明有些帮助:您能否展示证据和权限集是如何构造的?appDomainSetup中是否设置了其他内容。您可以通过fuslogvw获得一些见解。AFAIK创建程序集不会加载除mscorlib.dll之外的任何内容。IronPython通过调用CreateInstanceAndUnwrap for ScriptRuntime触发程序集的加载