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