我想在C#中包装一个DLL

时间:2016-03-14 07:27:42

标签: c# dll unmanaged wrapping

System.Windows.Forms.dll

我希望在C#类中包含此文件中的一些函数。

特别是:https://msdn.microsoft.com/en-us/library/system.windows.forms.cursor(v=vs.110).aspx

但我不知道如何获得功能列表。我试过没有返回结果的程序。我想知道是否有人可以给我一个而且只有一个例子?

例如,这会返回一个EntryPointNotFoundException

[DllImport("System.Windows.Forms.dll")]
public static extern void SetCursor(String s);

2 个答案:

答案 0 :(得分:0)

首先,您需要启用互操作服务才能调用Windows函数:

using System.Runtime.InteropServices;

然后,您只需声明要导入的方法:

[DllImport("winmm.dll")]
public static extern bool PlaySound(string filename,long hmodule, int dword );

这会在非托管的winmm.dll中创建PlaySound方法的“映射” 该方法创建为静态,并且 extern 关键字的使用告诉编译该方法在您的类外部(不在其中运行)

答案 1 :(得分:0)

要获取非托管功能的列表/搜索,您可以使用

http://www.pinvoke.net

例如,对于SetCursor,您可以致电

http://www.pinvoke.net/search.aspx?search=SetCursor&namespace=[All]

E.g。将光标放在SetCursorPos提供的位置

using System.Runtime.InteropServices;

...

// Wrapper
class CursorNativeMethods {
  [DllImport("User32.dll",
             EntryPoint = "SetCursorPos",
             CallingConvention = CallingConvention.Winapi)]
  [return: MarshalAs(UnmanagedType.Bool)]
  internal static extern Boolean SetCursorPos(Point point);
  ...
  [DllImport("User32.dll",
             EntryPoint = "GetCursorPos",
             CallingConvention = CallingConvention.Winapi)]
  [return: MarshalAs(UnmanagedType.Bool)]
  internal static extern Boolean GetCursorPos([Out] out Point point);
  ...
}

// Your Routine
public static class MyCursor {
  public Point Location {
    get {
      Point pt = new Point(-1, -1); 

      if (CursorNativeMethods.GetCursorPos(out pt))
        return pt;
      else 
        return new Point(-1, -1); 
    } 
    set {
      CursorNativeMethods.SetCursorPos(value);
    }
  }
  ...
} 

请注意,System.Windows.Forms.dll托管程序集(您不应该与之互操作),User32.dll非托管库