Edit: Na podstawie jakiejś krytyki zmuszając mnie do ponownego przemyślenia tego i badać ją dalej. Mogę swobodnie przyznać, że IntPtr jest podatny na błędy, myślę, że może toczyć się debata na temat tego, co "twardsze" oznacza, ale jeśli framework może zautomatyzować to i powstrzymać od konieczności przypinania rzeczy, itp. Jeśli nie używasz IntPtr to myślę Zgadzam się, że IntPtr byłby "trudniejszy", ale wydaje mi się, że po dalszych badaniach wydaje mi się, że będzie łatwiej (gdy zostaniesz zmuszony do P/Invoke i nie będziesz mógł utworzyć opakowania C++/CLI), aby zadeklarować swoją strukturę (w przypadku Version) w kodzie zarządzanym, a następnie przekazać je poprzez parametr ref.
[StructLayout(LayoutKind.Sequential)]
struct Version
{
// Data members
}
[DllImport("mydll.dll", CallingConvention=CallingConvention.Cdecl)]
public static extern Result Init(ref Version versionInfo);
Moje przypuszczenie byłoby co chcesz wersję IntPtr. różnica polega na tym, że IntPtr jest klasa, która zarządza wskaźnik do pamięć, podczas gdy deklarowanie parametru jako odniesienia (słowa kluczowego ref) na liście argumentów oznacza, że przechodzisz przez odniesienie. Generalnie podczas przekazywania danych do i od niezarządzanej biblioteki dll za pośrednictwem wywołania P/Invoke, chyba że przekazywane dane są typu waniliowego (int, double, string - z odpowiednią dekoracją Marshalla) przekazuję dane jako IntPtr. Następnie możesz przekazać Intrtr do zarządzanej deklaracji struktury niezarządzanej.
Należy sprawdzić ten link, aby uzyskać więcej informacji na temat P/Invoke wzywa: http://msdn.microsoft.com/en-us/magazine/cc164123.aspx
To niefortunne, że robisz rzeczy w trudny, podatny na błędy sposób. Jeszcze bardziej niefortunne jest to, że uczysz innych ludzi również. –
@Ben Z przyjemnością nauczę się łatwiejszego/mniej podatnego na błędy sposobu na zrobienie tego. Czy masz link lub sugerowany materiał do czytania.Nie spędzam zbyt wiele czasu na przywoływaniu rzeczy, przez większość czasu piszę wrapper C++/CLI, ale kiedy zszedłem do P/Invoke użyłem tylko parametrów ref dla takich rzeczy jak int, string (StringBuilder w przypadkach come), itp., A następnie używane IntPtr do innych rzeczy. – pstrjds
C++/CLI dla wygranej :) Na te okazje, kiedy nie możesz go użyć (Windows CE lub nie możesz być pewien, że zostanie zainstalowane środowisko uruchomieniowe Visual C++), wtedy http://pinvoke.net ma okropne wiele przykładów. Ogólnie rzecz biorąc, nie tylko typy pierwotne, takie jak 'int' i' double', mogą być bezpiecznie używane w sygnaturach p/invoke, ale także typy zdefiniowane przez użytkownika, składające się z typów pierwotnych. Przykładami mogą być 'POINT',' POINTF', 'RECT',' FONTMETRIC', 'BITMAPFILEHEADER', itp. –