Mam następujący C definicja ++ funkcja, której staram się wywołać poprzez PInvoke od kodu zarządzanego:Prawidłowy sposób na dowódcę SIZE_T *?
bool FooBar(SIZE_T* arg1);
Moja udało 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ć takie same W końcu to robiłem. To nie jest 64-bitowy przenośny. SIZE_T ma zmienną wielkość (32-64 bitów), podobnie jak wskaźnik do niego. Na zarządzanym rozmiarze wskaźnik poprawnie przekłada się na 64-bitowy, ale uint tego nie robi i możesz skończyć z kosza w górnych bitach arg1. Było to szczególnie uporczywy błąd od śmieci było często tylko zer :(
Jedynym rozwiązaniem Dostałem do pracy jest następujący udało deklaracja:
[DllImport("mydll", SetLastError=true, CharSet=CharSet.Unicode)]
private static extern bool FooBar(ref IntPtr arg1);
Działa to oczywiście dlatego IntPtr można zmieniać jego rozmiar W moim kodzie właśnie traktuję IntPtr jako liczbę całkowitą, i działa, chociaż wygląda na brzydkie hack.Myślę, że powinien być jakiś sposób, aby określić to poprawnie, być może za pomocą UnmanagedType.SysUInt, ale byłem nie można znaleźć innego działającego rozwiązania:
Uważam to za brzydkie hackowanie, ponieważ IntPtr powinien reprezentować wskaźnik na coś. Po prostu traktuję to bezpośrednio jako liczbę całkowitą. SysUInt w szczególności stwierdza, że jest to reprezentacja rozmiaru zmiennego uint. Dokładnie to, czego chcę, z wyjątkiem tego, że nie potrafię wymyślić, jak poprawnie go sformułować jako wskaźnika SysUInt, a nie SysUInt. – sooniln
Używasz wskaźnika do SIZE_T jako argumentu, Soonil. IntPtr wygląda bardzo dobrze –
Zauważysz, że nie używam IntPtr, ale używam ref IntPtr. – sooniln