とにかくメモリアドレスを呼び出す方法はありますか( (void*) f = 0xFFFF; のように) IntPtr またはネイティブの Win32 関数を使用しません。実行可能ローダーに対してこれを行う必要があります(COSMOSと呼ばれるオープンソースプロジェクトを使用するOS用です)
1686 次
1 に答える
1
を使用せずに適切な C# の高レベルな方法でそれを行う方法はありませんMarshal.GetDelegateForFunctionPointer
。
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate void CallMeDelegate(int i);
CallMeDelegate del = (CallMeDelegate)Marshal.GetDelegateForFunctionPointer(new IntPtr(0xffff), typeof(CallMeDelegate));
IntPtr は、その名前だけがネイティブ Windows ではないことに注意してください。これは、現在のコンパイル ターゲット (32 ビットまたは 64 ビット) の典型的なポインター値です。
通常の C# デリゲート構文で使用できるようにするには、呼び出し規則を指定する必要があるため、その API を使用することはできません。Marshal.GetDelegateForFunctionPointer がすべての面倒な作業をプラットフォームに依存せずに行うという事実に満足してください!
于 2012-08-25T08:20:42.677 に答える