在紧凑的框架(3.5)上我有一个pinvoke如下:
[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选项。
有更好的方法吗?
答案 0 :(得分:0)
我倾向于为委托参数传递IntPtrs,然后使用Memory窗口来查看它们中的确切内容。它是指向数据的指针吗?指向指针的指针?数据本身?是Unicode还是ASCII?所有这些都可以通过遍历返回的地址来确定。然后,您可以从该目标手动复制,也可以根据您的发现重新处理P / Invoke和/或委托签名。