Poprawny sposób na marszałka SIZE_T *?

Mam następującą definicję funkcji C ++, którą próbuję wywołać przez PInvoke z kodu zarządzanego:

bool FooBar(SIZE_T* arg1);

Moja zarządzana deklaracja wyglądała następująco:

[DllImport("mydll", SetLastError=true, CharSet=CharSet.Unicode)]
private static extern bool FooBar(ref uint arg1);

Niektórzy z was mogą zauważyć ten sam błąd, który w końcu zrobiłem. To nie jest przenośny 64-bitowy. SIZE_T ma zmienny rozmiar (32-64 bit), podobnie jak wskaźnik do niego. W zarządzanym rozmiarze wskaźnik poprawnie tłumaczy na 64-bitowy, ale uint nie, i można skończyć z koszem w wyższych bitach arg1. To był szczególnie trwały błąd, ponieważ kosz był często tylko zerami :(

Jedynym rozwiązaniem, które udało mi się uruchomić, jest następująca zarządzana deklaracja:

[DllImport("mydll", SetLastError=true, CharSet=CharSet.Unicode)]
private static extern bool FooBar(ref IntPtr arg1);

Działa to oczywiście, ponieważ IntPtr może poprawnie zmieniać swój rozmiar. W moim kodzie po prostu traktuję IntPtr jako liczbę całkowitą i działa, chociaż wygląda to jak brzydki hack. Wydaje mi się, że powinien istnieć jakiś sposób na poprawne określenie tego, być może przy użyciu UnmanagedType.SysUInt, ale nie udało mi się znaleźć żadnego innego rozwiązania roboczego.

questionAnswers(2)

yourAnswerToTheQuestion