如何编组多字节字符集 C#

Posted

技术标签:

【中文标题】如何编组多字节字符集 C#【英文标题】:How to marshal the multi byte character set C# 【发布时间】:2012-09-24 19:14:31 【问题描述】:

我需要调用一个使用 C# 中的多字节字符集的函数 (c/c++)。但我不知道如何将它编组为多字节。有谁知道如何将结果转换为字符串?

C#:

[DllImport("essentials.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
        public static extern System.IntPtr GetFiles(string filedir, string path);

        [STAThread]
        static void Main()
        
            string filedir = @"C:\Users\Ruben\Documents\School\*";
            string path = @"C:\Users\Ruben\Documents\School\";
            System.IntPtr pointer = GetFiles(filedir, path);
            string files = Marshal.PtrToStringAnsi(pointer); // nothing
        

C++

extern "C"

    __declspec(dllexport) char* GetFiles(char* filedir, char* path)
    
        string filedir2 = filedir;
        string path2 = path;
        string files = GetFiles2(filedir2, path2);
        char* Rfiles = new char[files.length() + 1];
        strcpy_s(Rfiles, files.length() + 1, files.c_str());
        return Rfiles;
    

【问题讨论】:

使用调试器调试您的本机代码。一种解释是字符串只是空的。你不能pinvoke这个代码,你分配的char[]不能被再次删除。 【参考方案1】:

MSDN 上的信息:Default Marshaling for Strings

【讨论】:

【参考方案2】:

你需要先编组 C# 字符串,试试这个:

[DllImport("essentials.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
    public static extern System.IntPtr GetFiles
        ([MarshalAs(UnmanagedType.AnsiBStr)]string filedir,
        [MarshalAs(UnmanagedType.AnsiBStr)]string path);

【讨论】:

以上是关于如何编组多字节字符集 C#的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中编组 wstring *?

如何在 C# 中编组指向一系列以 null 结尾的字符串的指针?

C#编组来自C++ DLL的无符号字符返回值[重复]

C# 中的字符 * 编组

C# 和 C++ dll - 编组字符串

将字符串从 c# 编组到 c++