大家好。我调用一个外国人写的软件的dll。但是他们不支持中文路径。我找到一些转换方法,把C#的string转化为byte[],就能解决。但是dll里面是一个string[],我就不知道该怎么转换了,试了n多方法都不行。各位高手解惑。详细说一下:
1.成功的调用string类型如下
dll中的函数原型为:
VLC_PUBLIC_API libvlc_media_t *libvlc_media_new(const char * psz_mrl);
我调用方法为:
[DllImport("libvlc")]
private static extern MediaHandle libvlc_media_new([MarshalAs(UnmanagedType.LPArray)] byte[] link);
然后对string进行了转码:
UTF8Encoding utf8 = new UTF8Encoding();
mediaHandle = libvlc_media_new(utf8.GetBytes(filename));
这样对中文路径就能非常好的转码。dll也能成功接收。我试验了其他方法,如dllimport设置charset,四个我都设置了,不通过。或者([MarshalAs(UnmanagedType.LPStr)] string link 也不行。只要是dllimport里面用string就不行。2. 我迷惑的调用string[]的地方:
dll中函数原型为:
VLC_PUBLIC_API libvlc_instance_t *libvlc_new( int , const char *const *);
我的调用方法:
[DllImport("libvlc")]
private static extern CoreHandle libvlc_new(int argc, string[] argv);
将string[]转化为byte[][]还是byte[,]?如何转化?
public Core(string[] argv, ref ExceptionStruct ex)
{
    //argv如何转化?
    coreHandle = libvlc_new(argv.Length, argv, ref ex);
}

解决方案 »

  1.   

    要传入VC的的数组指针。
    如果是C#的话,确实对应的是string[],但是你要转化为byte[],应该是byte[数组长度][]
      

  2.   

    byte[数组长度][]会报错说不能封装发送。
      

  3.   

    byte[][] argvbytes = new byte[argv.Length][];            for (int i = 0; i < argv.Length; i++)
                {
                    argvbytes[i] = Encoding.UTF8.GetBytes(argv[i]);
                }
                
                coreHandle = libvlc_new(argv.Length, argvbytes);无法封送处理“parameter #2”: 嵌套的数组不支持封送处理。
      

  4.   


                byte[,] argvbytes = new byte[argv.Length,1000];            for (int i = 0; i < argv.Length; i++)
                {
                    for (int j = 0; j < Encoding.UTF8.GetBytes(argv[i]).Length; j++)
                    {
                        argvbytes[i, j] = Encoding.UTF8.GetBytes(argv[i])[j];
                    }
                }
                
                coreHandle = libvlc_new(argv.Length, argvbytes, ref ex);尝试读取或写入受保护的内存。这通常指示其他内存已损坏。