gpt4 book ai didi

c# - 使用受限执行区

转载 作者:行者123 更新时间:2023-11-30 13:50:56 26 4
gpt4 key购买 nike

我有一个 Visual Studio 2008 C# .NET 3.5 应用程序,它 P/Invokes 一个接受文件句柄作为参数的 native 方法。最初,我只是使用 FileStream.SafeFileHandle.DangerousGetHandle() 来获取文件句柄。但是,在打开 FX COP 之后,我得到了一个 CA2001对此发出警告。所以,经过一些研究,我发现了“Constrained execute regions”。这对我来说是新的,我还没有看到很多关于它的信息。我希望更有经验的人可以看看并验证我是否正确完成了此操作。

class MyClass
{
public static bool Write(string filename)
{
using (var fs = new System.IO.FileStream(filename,
System.IO.FileMode.Create,
System.IO.FileAccess.Write,
System.IO.FileShare.None))
{
bool got_handle;
bool result;

System.Runtime.CompilerServices.RuntimeHelpers.PrepareConstrainedRegions();
try { }
finally
{
fs.SafeFileHandle.DangerousAddRef(ref got_handle);
result = NativeMethods.Foo(fs.SafeFileHandle.DangerousGetHandle());
if (got_handle)
fs.SafeFileHandle.DangerousRelease();
}

return result;
}
}
}

internal sealed class NativeMethods
{
[DllImport("mylib.dll",
EntryPoint = "Foo",
CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Unicode,
ExactSpelling = true,
SetLastError = true)]
public static extern bool Foo(IntPtr hFile);
}

谢谢,保罗H

最佳答案

你在这里做了几件事。

  1. 执行 finally block 中的代码以防止在执行安全代码时出现 ThreadAbortExceptions。

  2. 在您调用 PrepareConstrainedRegions 的 try/finally 技巧之前,它基本上什么都不做,只是检查是否存在足够的线程堆栈空间以确保至少可以进行一些方法调用,这样您的安全代码就不会措手不及通过 StackOverFlowException。

所以是的,您的代码看起来尽可能安全。在官方docu关于 CER,据说 CLR 也承认这个 try/finally block ,并采取了额外的措施。据我所见,除了 OutOfMemoryExceptions 在您的 CER 代码运行后也会延迟外,没有太大区别。

要真正确保您的代码符合您的期望,您应该为这些东西创建测试。

  • 堆栈耗尽
  • 内存不足
  • 线程中止

编写可靠的代码真的很难,甚至大多数 BCL 类都不是 hardened反对乔达菲解释的事情。即使您的代码没有失败,BCL 代码也可以。在 BCL 代码的主要部分能够以明确定义的方式应对这些极端条件之前,您不会获得更多好处。

您的, 阿洛伊斯·克劳斯

关于c# - 使用受限执行区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5330799/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com