如何在C#String和C Char指针之间进行转换

时间:2016-10-17 15:17:26

标签: c# c

我有一个用C编写的大型库,我想在C#程序中用作DLL。大多数C代码将由库自己的函数使用,但我确实需要一个函数才能从C#项目中调用。

所以下面有一个C函数示例

__declspec(dllexport) char* test(char* a){
    char* b = "World";
    char* result = malloc(strlen(a) + strlen(b) + 1);

    strcpy(result, a);
    strcpy(result, b);

    return result;
}

现在在C#代码中我得到了using System.Running.InteropServices; 还有[DllImport("mydll.dll")],但我不确定如何宣布这个功能。

public static extern char* test(char* a);显然不起作用,因为C#不支持像C这样的指针。

那么我应该如何将字符串传递给这个C函数并让它返回一个字符串呢?

1 个答案:

答案 0 :(得分:6)

您正在寻找MarshalAs属性:

   [DllImport("mydll.dll")]
   static public int test([MarshalAs(UnmanagedType.LPStr)]String a);

至于返回动态分配的C字符串,不好主意。你如何可靠地解除分配字符串?它是内存泄漏的秘诀。在C#中分配一个字节数组,将其固定并将其传递给C代码及其大小,以便C代码可以将结果复制到其中。然后使用System.Text.Encoding.ASCII.GetString()转换为字符串。