我正在写一个允许两个程序竞争的国际象棋游戏,玩家需要编写一个DLL并公开一个函数来告诉主应用程序他的玩家接下来要移动的位置,假设该函数看起来像这样
public static void MoveNext(out int x, out int y, out int discKind);
玩家的DLL可以使用 C#或C ++编写。
在国际象棋游戏应用程序中,我开始一个新的线程来调用玩家的DLL暴露的功能,以获得他将在一个回合中移动的位置,并且我启动计时器以防止玩家超时,如果玩家超时我会通过以下API
杀死相应的线程thread.Abort();
thread.Join();
我有以下问题如下所述:
线程无法100%保证杀死(取决于玩家的代码)
在测试过程中,我发现,如果播放器使用深度递归(如果播放器程序中存在内存泄漏),则主机应用程序的内存使用量将增加,然后主机应用程序将终止任何例外。
是否有任何技术,想法或方法可以解决上述问题?
从 CodeInChaos 建议将播放器的DLL加载到单独的域中,然后在必要时卸载它,我不确定它是否仍适用于非托管DLL(C ++),如果它会导致效率低下吗?
答案 0 :(得分:8)
AppDomain中的未处理异常仍会导致您的程序在.Net 2.0中终止。您有机会通过事件处理程序响应异常但不能处理它。
最好的办法是使用流程进行您正在寻找的那种隔离。
答案 1 :(得分:4)
如果,您可以确保您的插件DLL始终是托管代码,那么您可以选择在主应用程序逻辑中创建一个新的应用程序域,并将包含该插件的程序集加载到该域中。 / p>
然后,您可以选择在特定应用域中捕获未处理的摘要,然后您可以选择卸载整个应用域。这样你就可以应对其他人的应用程序插件行为不端和抛出异常。您还可以选择指定部分信任来进一步限制插件可以执行的操作。
但是,如果您不能强制使用托管代码插件,这将无济于事,并且一组单独进程的早期选项将更加合适。
阅读你的帖子agin似乎你必须使用的插件有一些质量问题。如果你必须应对这些有缺陷的插件,我会采用以前的建议并采用单独的过程。