Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在紧凑型框架中编组字符数组_C#_Compact Framework_Pinvoke - Fatal编程技术网

C# 在紧凑型框架中编组字符数组

C# 在紧凑型框架中编组字符数组,c#,compact-framework,pinvoke,C#,Compact Framework,Pinvoke,在compact framework 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 openLiteSp

在compact framework 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属性上指定字符集,使用byte[]数组(这会导致回调根本不被调用),并指定各种MarshalAs选项


有更好的方法吗?

我倾向于传递代理参数的intptr,然后使用内存窗口查看它们中返回的内容。它是指向数据的指针吗?指向指针的指针?数据本身?它是Unicode还是ASCII?所有这些都可以通过遍历返回的地址来确定。然后,您可以从该目标手动复制,也可以根据您的发现重新处理P/Invoke和/或委托签名