从C#.NET调用IsWowProcess2(P/Invoke)

从C#.NET调用IsWowProcess2(P/Invoke),c#,.net,windows,winapi,pinvoke,C#,.net,Windows,Winapi,Pinvoke,我从未在C#中创建过p/Invoke包装器方法,因为有一种方法可以使用.NET Framework类以“托管方式”来实现 然而,我需要调用Win32 API函数,我发现这并不像我想象的那么容易 在ISWOWPrime2中的函数,以及从C++调用它的代码。 我创建了一个愚蠢的程序来测试它,但当然,它不起作用: class Program { static void Main(string[] args) { var result = IsWowProcess2()

我从未在C#中创建过p/Invoke包装器方法,因为有一种方法可以使用.NET Framework类以“托管方式”来实现

然而,我需要调用Win32 API函数,我发现这并不像我想象的那么容易

在ISWOWPrime2中的函数,以及从C++调用它的代码。

我创建了一个愚蠢的程序来测试它,但当然,它不起作用:

class Program
{
    static void Main(string[] args)
    {
        var result = IsWowProcess2();
    }

    [DllImport("kernel32.dll", CharSet = CharSet.Unicode, ExactSpelling = false, PreserveSig = true)]
    private static extern MyStruct IsWowProcess2();
}

internal class MyStruct
{
    public ushort One { get; set; }
    public ushort Two { get; set; }
}
创建包装器方法的正确方法是什么以及如何调用它?

从阅读开始。签字如下:

BOOL IsWow64Process2(
  HANDLE hProcess,
  USHORT *pProcessMachine,
  USHORT *pNativeMachine
);
作为pinvoke,即:

[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool IsWow64Process2(
    IntPtr process, 
    out ushort processMachine, 
    out ushort nativeMachine
);
我不知道您的尝试从何而来,但它看起来不像是正确的声明,事实上,甚至函数的名称都是错误的。互操作编程是关于细节和将一个二进制接口与另一个匹配的。你不能发明界面。要传递的参数、函数名称等细节都需要匹配

你可以这样称呼它:

ushort processMachine;
ushort nativeMachine;
if (!IsWow64Process2(GetCurrentProcess(), out processMachine, out nativeMachine))
    throw new Win32Exception();
您还需要
GetCurrentProcess
的声明。您可以使用以下选项:

[DllImport("kernel32.dll")]
private static extern IntPtr GetCurrentProcess();
从阅读文章开始。签字如下:

BOOL IsWow64Process2(
  HANDLE hProcess,
  USHORT *pProcessMachine,
  USHORT *pNativeMachine
);
作为pinvoke,即:

[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool IsWow64Process2(
    IntPtr process, 
    out ushort processMachine, 
    out ushort nativeMachine
);
我不知道您的尝试从何而来,但它看起来不像是正确的声明,事实上,甚至函数的名称都是错误的。互操作编程是关于细节和将一个二进制接口与另一个匹配的。你不能发明界面。要传递的参数、函数名称等细节都需要匹配

你可以这样称呼它:

ushort processMachine;
ushort nativeMachine;
if (!IsWow64Process2(GetCurrentProcess(), out processMachine, out nativeMachine))
    throw new Win32Exception();
您还需要
GetCurrentProcess
的声明。您可以使用以下选项:

[DllImport("kernel32.dll")]
private static extern IntPtr GetCurrentProcess();

如果您使用的是最新版本的框架(特别是4.7.1或更高版本,或.NET Core),则可能不需要此功能,您需要的内容可以通过获取。如果您使用的是最新版本的框架(特别是4.7.1或更高版本,或.NET Core),则可能不需要此功能,您需要的内容可以通过获取。