【发布时间】:2013-02-25 21:35:22
【问题描述】:
如何将 win32 连接到 C# 并使用 win32 函数创建信号量、互斥量等。
【问题讨论】:
-
我尝试使用 System.Runtime.InteropServices; 和 [DllImport("kernel32.dll", SetLastError = true)] 但我不知道对吗
标签: c# multithreading winapi mutex semaphore
如何将 win32 连接到 C# 并使用 win32 函数创建信号量、互斥量等。
【问题讨论】:
标签: c# multithreading winapi mutex semaphore
您无需使用 Win32 API 即可使用互斥锁或信号量。他们已经为此内置了 .NET 类,并且从 1.1 版开始用于 Mutex 和 2.0 版用于 Semaphore:
显示 Mutex 类实际上使用 Win32 API 的一些 .NET 内部结构:作为一个快速示例,下面的代码是 .NET 中 Threading.Mutex 类的 OpenMutex 和 ReleaseMutex 方法的反编译源。它使用 DllImport 属性和 extern 关键字来访问 kernel32.dll 中的函数
[DllImport("kernel32.dll", CharSet=CharSet.Auto, SetLastError=true)]
internal static extern SafeWaitHandle OpenMutex(int desiredAccess, bool inheritHandle, string name);
[DllImport("kernel32.dll", CharSet=CharSet.None)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
internal static extern bool ReleaseMutex(SafeWaitHandle handle);
我想您可以使用这些 sn-ps 进行探索,并且可以在这个方便的网站上获得更多信息:http://www.pinvoke.net/index.aspx
【讨论】:
C# 提供了自己的方法来做这些事情。您不必将 Win32 和 C# 混合使用,而且绝对不建议这样做,因为 .NET 旨在取代 Win32。
MSDN 在how to use a mutex in .NET (and semaphores too) 上有一个示例。
如果您仍希望使用 .NET 和 Win32,则必须使用启用 CLI 的 C++。
【讨论】: