Diskuze: Převod procedur
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 2 zpráv z 2.
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Definice, která by měla fungovat, je dole. Ještě bude záležet na tom, jestli nativní DLL bylo překládáno 32-bit nebo 64-bitovým překladačem, v tom případě se bude lišit structure packing, pak se buď musí specifikovat správná hodnota pro StructLayout nebo definovat structure offsets.
Ale upřímně, pohybuješ se na velice tenkém ledě. Marshalling je poměrně komplikovaná záležitost a vyžaduje znalost toho, jak funguje C++ i jak funguje C# marshalling a garbage collector. Soudě podle tvého řešení bych doporučil to radši nechat na někom, kdo se v tom vyzná.
Nejhorší možná scénář je, že program bude naprosto nekontrolovatelně a náhodně padat a chybu nikdy nedohledáte.
[StructLayout(LayoutKind.Sequential)]
public struct BLVInfo
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 13)]
public Byte[] device;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 13)]
public Byte[] model;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public Byte[] version;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public Byte[] features;
[MarshalAs(UnmanagedType.U4)]
public Int32 country;
[MarshalAs(UnmanagedType.U4)]
public Int32 decimals;
[MarshalAs(UnmanagedType.U4)]
public Int32 escrowcap;
[MarshalAs(UnmanagedType.U4)]
public Int32 stackercap;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public Int32[] bill_value;
}
[DllImport("WinMDB32.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int GetBLVInfo([param: In, Out] ref BLVInfo bip);
Zobrazeno 2 zpráv z 2.