假设我有一个应用程序,用户可以在其中提供用JavaScript编写的脚本来执行某些任务.这是使用Jint完成的.但是,编写错误的脚本会导致Stack Overflow异常JintEngine.Run(),从而导致整个应用程序崩溃.我宁愿告诉用户脚本中的错误.
我试图在另一个应用程序域上运行Jint,这没有帮助,导致SOE上的AFAIK默认操作正在退出进程.可以通过使用CLR托管来改变任何其他方式吗?
我知道我可以运行单独的流程,这是我的后备,但我不想这样做.
我使用Applicationdomain动态加载一个DLL,以便在nessesary时卸载.如果加载的dll中的任务终止,那么我无法工作的是来自创建的Appdomain的回调方法.
到目前为止我有什么
public interface IBootStrapper
{
void AsyncStart();
void StopAndWaitForCompletion();
event EventHandler TerminatedItself;
}
Run Code Online (Sandbox Code Playgroud)
和"初学者"方面
private static Procedure CreateDomainAndStartExecuting()
{
AppDomain domain = AppDomain.CreateDomain("foo", null, CODEPATH, string.Empty, true);
IBootStrapper strapper = (IBootStrapper)domain.CreateInstanceAndUnwrap(DYNAMIC_ASSEMBLY_NAME, CLASSNAME);
strapper.ClosedItself += OnClosedItself;
strapper.AsyncStart();
return delegate
{
strapper.StopAndWaitForCompletion();
AppDomain.Unload(domain);
};
}
Run Code Online (Sandbox Code Playgroud)
这导致程序集未找到异常,因为OnClosedItself()是一个只有Starter知道的类型的方法,它在appdomain中不存在.
如果我将OnClosedItself作为委托包装在一个可序列化的类中,它就是一样的.
有什么建议?
编辑:我正在尝试做的是建立一个自我更新的任务.因此我创建了一个启动器,如果有新版本可以停止并重新创建任务.但是如果任务从其他地方停止,它也应该通知启动器终止.
//从问题中删除了大量临时代码
编辑2:哈普洛指出我正确的方向.我能够用信号量实现回调.
我有一个程序执行24小时,然后重新启动.
如何将main()从一个单独的应用程序域转移到每24小时拆除并刷新一次,以便彻底消除任何潜在的内存泄漏?
来自MSDN的引用:http://msdn.microsoft.com/en-us/library/6kac2kdh.aspx
一个或多个托管线程(由System.Threading.Thread表示)可以在同一个托管进程中的一个或任意数量的应用程序域中运行.尽管每个应用程序域都是使用单个线程启动的,但该应用程序域中的代码可以创建其他应用程序域和其他线程.结果是托管线程可以在同一个托管进程内的应用程序域之间自由移动 ; 您可能只有一个线程在多个应用程序域之间移动.
我试图用两个共享一个线程的应用程序域编写代码.但我放弃了.我真的不知道这是怎么回事.你能给我一个代码示例吗?
我在Windows窗体应用程序的应用程序项目类路径目录中有一个文本文件。现在在安装时,我正在尝试将文本值写入文本文件。这是我的文本文件安装程序类代码。
File.WriteAllText(AppDomain.CurrentDomain.BaseDirectory + @"\" + "ConnectionString.txt",param3);
Run Code Online (Sandbox Code Playgroud)
安装后,我想检索在“ ConnectionString.txt”文件中输入的文本,并在应用程序中使用它,但是我没有得到如何检索文本文件中存在的文本值的信息。