C# 来自字符串的内存地址

C# 来自字符串的内存地址,c#,memory,C#,Memory,我有写内存的函数,但我想从字符串中导入地址,怎么做? 代码: 这是: WriteProcessMemory((int)processHandle, 0xffffffff, buffer, buffer.Length, ref bytesWritten); 我想将此0xFFFFFF替换为字符串,但我不知道如何执行此操作。我尝试将带有地址的字符串转换为int,但这不起作用。使用类似以下内容: string str = "0xffffffffffffffff"; if (str.StartsWith

我有写内存的函数,但我想从字符串中导入地址,怎么做? 代码:

这是:

WriteProcessMemory((int)processHandle, 0xffffffff, buffer, buffer.Length, ref bytesWritten);
我想将此0xFFFFFF替换为字符串,但我不知道如何执行此操作。我尝试将带有地址的字符串转换为int,但这不起作用。

使用类似以下内容:

string str = "0xffffffffffffffff";
if (str.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
{
    str = str.Substring(2);
}
IntPtr ptr = (IntPtr)long.Parse(str, NumberStyles.HexNumber);
请注意,long.Parse不支持0x,因此如果存在,我将删除它

我使用long.Parse来支持64位系统和32位系统

请注意,您使用的PInvoke签名是错误的。。。它适用于32位,但与32位和64位兼容的通用配置是:

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool WriteProcessMemory(
    IntPtr hProcess, 
    IntPtr lpBaseAddress, 
    byte[] lpBuffer, 
    IntPtr dwSize, 
    out IntPtr lpNumberOfBytesWritten);

如果您需要编译IntPtr,您应该始终将其转换为long,因为IntPtr可以是32位或64位,所以long可以始终包含它。

请解释更多信息,我想从字符串中导入地址?您试图将数字从十六进制格式的字符串解析为整数。内存地址与此无关。问题不清楚。你有字符串或者你想格式化它?我会避免最后转换为IntPtr。当然,这没有错,但这不是OP想要的,显然他在试图传递一个int。@Theodoroschatzigannakis他传递的0xFFFFFF是WriteProcessMemory的第二个参数,即要写入的基址的LPVOID。所以IntPtr。他的呕吐是错的。。。。我会写正确的。
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool WriteProcessMemory(
    IntPtr hProcess, 
    IntPtr lpBaseAddress, 
    byte[] lpBuffer, 
    IntPtr dwSize, 
    out IntPtr lpNumberOfBytesWritten);