如何使用.NET 2.0安全地托管插件

Car*_*Liu 6 .net c# hosting

我正在写一个允许两个程序竞争的国际象棋游戏,玩家需要编写一个DLL并公开一个函数来告诉主应用程序他的玩家接下来要移动的位置,假设该函数看起来像这样

public static void MoveNext(out int x, out int y, out int discKind);
Run Code Online (Sandbox Code Playgroud)

播放器的DLL可以使用C#或C++编写.

在国际象棋游戏应用程序中,我启动一个新线程来调用玩家的DLL暴露的功能,以获得他将在一个回合中移动的位置,并且我启动计时器以防止玩家超时,如果玩家超时我会杀死相应的遵循API的线程

thread.Abort();
thread.Join();
Run Code Online (Sandbox Code Playgroud)

我有以下问题如下所述:

  1. 线程不能被100%保证杀死(这取决于玩家的代码)

  2. 在测试期间,我发现,如果播放器使用深度递归(并且如果播放器程序中存在内存泄漏),则主机应用程序的内存使用量将增加,然后主机应用程序将终止,没有任何异常.

是否有任何技术,想法或方法可以解决上述问题?

从这个CodeInChaos建议将播放器的DLL加载到单独的域,然后在必要时卸载它,我不确定它是否仍然适用于非托管DLL(C++),如果它会导致低效率?

小智 8

AppDomain中未处理的异常仍会导致程序在.Net 2.0中终止.您有机会通过事件处理程序响应异常但不能处理它.

您最好的选择是使用您正在寻找的隔离类型的流程.