因为有一种方法使用.NET Framework类做“的管理方式:”我从来没有建立在C#中的P / Invoke包装方法。
但是,我有需要调用Win32 API函数,我发现它并不像我想的那么简单。
在IsWowProcess2的功能,以及将码从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; }
}
什么是创建包装方法正确的方法,如何使用它?
通过阅读documentation启动。这给了签名:
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();