Where to put DllImport?

こ雲淡風輕ζ 提交于 2019-12-18 04:45:16

问题


static class Class    
{
    public static void methodRequiringStuffFromKernel32()
    {
        // code here...
    }
} 

Where do I put [DllImport("Kernel32.dll")] here?


回答1:


You put it on the method you're importing from Kernel32.dll.

For example,

static class Class    
{
    [DllImport("Kernel32.dll")]
    static extern Boolean Beep(UInt32 frequency, UInt32 duration);

    public static void methodRequiringStuffFromKernel32()
    {
        // code here...
        Beep(...);
    }
}

From @dtb: Note that the class should be named NativeMethods, SafeNativeMethods or UnsafeNativeMethods. See Naming Convention for Unmanaged Code Methods for more details.

CA1060: Move P/Invokes to NativeMethods class:

  • NativeMethods - This class does not suppress stack walks for unmanaged code permission. (System.Security.SuppressUnmanagedCodeSecurityAttribute must not be applied to this class.) This class is for methods that can be used anywhere because a stack walk will be performed.

  • SafeNativeMethods - This class suppresses stack walks for unmanaged code permission. (System.Security.SuppressUnmanagedCodeSecurityAttribute is applied to this class.) This class is for methods that are safe for anyone to call. Callers of these methods are not required to perform a full security review to make sure that the usage is secure because the methods are harmless for any caller.

  • UnsafeNativeMethods - This class suppresses stack walks for unmanaged code permission. (System.Security.SuppressUnmanagedCodeSecurityAttribute is applied to this class.) This class is for methods that are potentially dangerous. Any caller of these methods must perform a full security review to make sure that the usage is secure because no stack walk will be performed.




回答2:


This is an example of DllImport:

using System;
using System.Runtime.InteropServices;

class MsgBoxTest
{
  [DllImport("user32.dll")]
  static extern int MessageBox (IntPtr hWnd, string text, string caption,
                                int type);
  public static void Main()
  {
    MessageBox (IntPtr.Zero, "Please do not press this again.", "Attention", 0);
  }
}

I suggest you to study Platform Invoke Tutorial.




回答3:


static class Class    
{
    [DllImport("kerynel32.dll")]
    public static extern void methodRequiringStuffFromKernel32();

}

It goes on the method itself that's P/Invoking outside methods. Make sure to add a reference to System.Runtime.InteropServices



来源:https://stackoverflow.com/questions/6076717/where-to-put-dllimport

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!