是否可以在C#中控制线程的某些权限(尤其是从它创建的线程)?
我正在开发一个C#应用程序,其中创建了一个新线程并执行某些用户给定的代码。
如何控制用户代码CAN和CAN不能执行的操作?这有可能吗?
特别是,我想从使用代码中限制对某些API的访问。
一个具体的例子是我想禁用从用户代码中生成新线程的能力。
*原因是用户代码可能会产生可能不能自己处理异常的新线程,从而导致整个应用程序崩溃。
答案 0 :(得分:2)
没有内置的方法可以阻止在.Net中创建线程,因为创建胎面不需要任何额外的权限。
用户代码如何产生另一个线程的方式也有多种。
如果您的目标是执行恶意外部程序集,则需要保护其不仅仅是创建线程(例如,StackOverflowException非常容易抛出并在不创建新线程的情况下关闭进程)。
答案 1 :(得分:0)
为什么不试试这段代码。
Application.ThreadException + = OnHandledException;
private static void OnHandledException(object sender,ThreadExceptionEventArgs e){ //在这里处理 }
如果您关注的是未处理的异常。该片段可以解决问题。
答案 2 :(得分:0)
将应用程序与“插件”隔离的一种方法是使用单独的AppDomain来托管它。然而,这并不容易,主要是因为绝缘需要编组参考。您永远不能直接引用另一个AppDomain中的实例,因为这会破坏绝缘,因此.NET支持复杂的代理模型。这样做的缺点是,所有代码都必须以此代理编写,代理引用对象派生自MarshalByRefObject,所有非代理对象必须支持序列化以通过复制跨越远程边界。所有这些自然也会带来性能上的打击。但是,一旦完成这项工作,您现在可以允许AppDomain“崩溃”而不会关闭整个应用程序,尽管您的主应用程序仍然必须处理生成的异常(任何封送的引用调用都可能抛出RemotingException,如果引用已“死亡”。)
隔离的下一步是创建一个外部托管进程,并使用某种形式的进程间通信来与外部代码进行交互。这为您提供了出色的隔离(甚至可以防止大多数非托管代码不稳定:AppDomain中的错误非托管代码仍然可以降低整个应用程序)但是它会增加更多的复杂性和性能开销。