我有一個Visual Studio 2008 C#.NET 3.5應用程序,它將P /調用接受文件句柄作爲參數的本地方法。最初,我只是使用FileStream.SafeFileHandle.DangerousGetHandle()來獲取文件句柄。但是,在開啓FX COP後,我得到了一個CA2001的警告。所以,經過一番研究,我發現了「約束執行區域」。這對我來說是新的,我還沒有看到關於它的大量信息。我希望有更多經驗的人可以看看並確認我已經正確地做了這件事。使用約束執行區域
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);
}
感謝, PaulH
這是不行的,一個CER解決了一個不同的問題。 CER能夠抑制可能會影響終結器線程的異常。這在SQL Server中很重要,但它是您程序中的一項*責任*。當關鍵任務SQL Server實例由於用戶代碼鬆動而失敗時,Microsoft將獲得支持電話。他們不需要它,他們不能修復該代碼。你可以修復你的代碼,例外告訴你需要修復什麼。不要隱藏它們。 – 2011-03-16 21:15:51
那麼我會忽略CA2001的警告嗎?還是有更好的方式將文件句柄傳遞給本地函數? – PaulH 2011-03-16 21:28:30
是的。這是微軟員工發出處理回收攻擊可能性的警告。好人,但有點近視,他們認爲他們的問題也是我們的問題。我們希望。一個IntPtr是一個體面的方式來存儲一個句柄,該句柄不會引起任何投訴。如果您的代碼在一百萬臺桌面上運行,請不要採取此建議。 – 2011-03-16 21:44:16