コンパクトなフレームワーク (3.5) では、次のようにピンボークがあります。
[DllImport("VAMDll.dll", SetLastError = true, EntryPoint = "openLiteSpatial")]
public static extern int OpenLiteSpatial(byte[] mode, byte[] data, byte[] capture, IntPtr callback);
次のネイティブ関数 sig の場合:
int openLiteSpatial(char *mode, char *data, char *capture, void callBack(char *, char *));
パラメータを内部に渡すと、次のようにうまく機能します。
Native.OpenLiteSpatial(Encoding.UTF8.GetBytes(Mode.FunctionalLocation), Encoding.UTF8.GetBytes(functionalLocation), Encoding.UTF8.GetBytes(capture), Marshal.GetFunctionPointerForDelegate(callback));
しかし、私のコールバックでは、コールバック パラメータ文字列に対していくつかの奇妙な変換を行う必要があります。
public delegate void LiteSpatialCallback(string attributeData, string geoCoordinate);
public static void Callback(string attributeData, string geoCoordinate)
{
byte[] decodedAttributeData = Encoding.Unicode.GetBytes(attributeData);
byte[] decodedGeoCoordinate = Encoding.Unicode.GetBytes(geoCoordinate);
attributeData = Encoding.UTF8.GetString(decodedAttributeData, 0, decodedAttributeData.Length);
geoCoordinate = Encoding.UTF8.GetString(decodedGeoCoordinate, 0, decodedGeoCoordinate.Length);
}
DllImport 属性で Charset を指定し、byte[] 配列を使用して (これにより、コールバックがまったく呼び出されなくなります)、さまざまな MarshalAs オプションを指定してみました。
より良い方法はありますか?