【问题标题】:How to use win32 API with C# [closed]如何在 C# 中使用 win32 API [关闭]
【发布时间】:2013-02-25 21:35:22
【问题描述】:

如何将 win32 连接到 C# 并使用 win32 函数创建信号量、互斥量等。

【问题讨论】:

  • 我尝试使用 System.Runtime.InteropServices;[DllImport("kernel32.dll", SetLastError = true)] 但我不知道对吗

标签: c# multithreading winapi mutex semaphore


【解决方案1】:

您无需使用 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

【讨论】:

  • 我的任务是编写程序,使用 win32 和任何编程语言实现互斥锁和信号量任务。我知道Java,但很难将win32和java结合起来。我认为 C# 更接近 Java,并且更容易学习 C# 而不是 C++。所以我想知道如何编译win32和c#
  • 你检查过 Java JNI 吗? (Java 原生接口)en.wikipedia.org/wiki/Java_Native_Interface 这对你来说可能是更好的选择。
  • 而且... .NET 类实际上是围绕 Win32 函数的包装器。使用这些对象的方法比尝试直接访问 Win32 API 要简单得多。
  • 值得吗?我认为 C# 更接近 win32,使用 JNI 和 win32 很愚蠢
  • 检查我最近对 ​​DllImport 和 extern 的编辑。也可以看看这个网站:pinvoke.net/index.aspx
【解决方案2】:

C# 提供了自己的方法来做这些事情。您不必将 Win32 和 C# 混合使用,而且绝对不建议这样做,因为 .NET 旨在取代 Win32。

MSDN 在how to use a mutex in .NET (and semaphores too) 上有一个示例。

如果您仍希望使用 .NET 和 Win32,则必须使用启用 CLI 的 C++。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多