Использование C # управляемых структур / классов с Windows API - PullRequest
1 голос
/ 06 октября 2010

Мне надоело использовать Marshal.Copy, Marshal.Read* и Marshal.Write*, поэтому мне было интересно, есть ли способ принудительного приведения неуправляемого указателя памяти (типа IntPtr).

Примерно так:

IntPtr pointer = Marshal.AllocateHGlobal(sizeof(Foo));
Foo bar = (Foo)pointer;
bar.fooBar = someValue;
// call some API
Marshal.FreeHGlobal(pointer);
bar = null; // would be necessary?

1 Ответ

2 голосов
/ 06 октября 2010

Полагаю, вы после Marshal.PtrToStructure и Marshal.StructureToPtr .Пример кода там демонстрирует использование:

Point p;
p.x = 1;
p.y = 1;

Console.WriteLine("The value of first point is " + p.x +
                  " and " + p.y + ".");

// Initialize unmanged memory to hold the struct.
IntPtr pnt = Marshal.AllocHGlobal(Marshal.SizeOf(p));

try
{

    // Copy the struct to unmanaged memory.
    Marshal.StructureToPtr(p, pnt, false);

    // Create another point.
    Point anotherP;

    // Set this Point to the value of the 
    // Point in unmanaged memory. 
    anotherP = (Point)Marshal.PtrToStructure(pnt, typeof(Point));

    Console.WriteLine("The value of new point is " + anotherP.x +
                      " and " + anotherP.y + ".");

}
finally
{
    // Free the unmanaged memory.
    Marshal.FreeHGlobal(pnt);
}
...