2015-11-13 15 views
5

次のスニペットをC#.NETに変換できますか?C++からC#への関数の変換

template <class cData> 
cData Read(DWORD dwAddress) 
{ 
    cData cRead; //Generic Variable To Store Data 
    ReadProcessMemory(hProcess, (LPVOID)dwAddress, &cRead, sizeof(cData), NULL); //Win API - Reads Data At Specified Location 
    return cRead; //Returns Value At Specified dwAddress 
} 

あなたがC++でメモリからデータを読みたいとき、それはジェネリックですので、これは本当に便利です:あなたはRead<"int">(0x00)"Read<"vector">(0x00)を使用し、1つの関数にそれをすべて持っていることができます。

C#.NETでは、メモリを読み込むために、あらかじめ定義されたパラメータを持つDLLImport ReadProcessMemoryが必要です(もちろんこれは一般的ではありません)。

+0

おそらく、あなたはここで提案の戦略を使用することができます:http://stackoverflow.com/a/6336196/3150802を。しかし、確かに私はきちんとしたワンショットジェネリック関数でそれをパッケージ化する方法がわかりません。おそらく、ある種のシリアライズ可能なインターフェイスを実装するために読み込みに使用されたクラスを強制します。 –

+0

値型(構造体には管理されていないデータのみが含まれています)では、おそらくメモリアドレスを構造体へのポインタとして使用し、そのインスタンスのコピーを完全に一般的に 'where T:struct'制約でtype引数に返します。 –

+0

あなたの新しい「答え」では、あなたがベクトルを返すことを控えめに言っています。あなたは(もちろん、このオリジナルのポストで)明確にすることができますか?問題は面白いですが、なぜ特定のアドレスにintがある場合にベクトルを生成したいのか分かりません。 –

答えて

2

この作品のようなものはありませんか?

using System.Runtime.InteropServices; 

public static T Read<T>(IntPtr ptr) where T : struct 
{ 
    return (T)Marshal.PtrToStructure(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