从C++;到C#

从C++;到C#,c#,c++,generics,readprocessmemory,C#,C++,Generics,Readprocessmemory,能否将以下代码段转换为C#.NET 模板 cData读取(DWORD DWORD地址) { cData cRead;//用于存储数据的通用变量 ReadProcessMemory(hProcess,(LPVOID)dwAddress,&cRead,sizeof(cData),NULL);//Win API-在指定位置读取数据 return cRead;//返回指定地址处的值 } 这是非常有用的,当你想从C++中读取内存数据时,因为它是通用的:你可以使用 Read(0x00)或 Read(0x0

能否将以下代码段转换为C#.NET

模板
cData读取(DWORD DWORD地址)
{
cData cRead;//用于存储数据的通用变量
ReadProcessMemory(hProcess,(LPVOID)dwAddress,&cRead,sizeof(cData),NULL);//Win API-在指定位置读取数据
return cRead;//返回指定地址处的值
}
<>这是非常有用的,当你想从C++中读取内存数据时,因为它是通用的:你可以使用<代码> Read(0x00)或 Read(0x00),并把它全部放在一个函数中。
在C#.NET中,它对我不起作用,因为要读取内存,您需要具有预定义参数的DLLImport ReadProcessMemory,当然这些参数不是通用的。

类似的东西不起作用吗

using System.Runtime.InteropServices;

public static T Read<T>(IntPtr ptr) where T : struct
{
   return (T)Marshal.PtrToStructure(ptr, typeof(T));
}
使用System.Runtime.InteropServices;
公共静态T读(IntPtr ptr),其中T:struct
{
返回(T)Marshal.ptr结构(ptr,typeof(T));
}
<>这只适用于结构,如果需要的话,你需要考虑一个特殊的非一般情况下的编组字符串。

一个简单的检查,看看它是否工作:

var ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(int)));
var three = 3;
Marshal.StructureToPtr(three, ptr, true);
var data = Read<int>(ptr);
Debug.Assert(data == three); //true
var ptr=Marshal.AllocHGlobal(Marshal.SizeOf(typeof(int));
var三=3;
Marshal.StructureToPtr(三,ptr,true);
var数据=读取(ptr);
Assert(数据==3);//true

也许您可以使用此处建议的策略:。但无可否认,我不知道如何将其打包到一个简洁的一次性泛型函数中。也许可以强制用于读取的类实现某种可序列化的接口。对于值类型(仅包含非托管数据的结构)您可能只需使用内存地址作为指向结构的指针,并返回该实例的副本,完全通用,类型参数上带有
where T:struct
约束。在下面新的非“答案”中,您会突然说您希望返回一个向量。您能澄清一下(当然,在这篇原始文章中)?这个问题很有趣,但我不明白如果给定地址有int,为什么要生成向量。
var ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(int)));
var three = 3;
Marshal.StructureToPtr(three, ptr, true);
var data = Read<int>(ptr);
Debug.Assert(data == three); //true