我有一个用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;
}
Run Code Online (Sandbox Code Playgroud)
现在我已经获得了C#代码using System.Running.InteropServices;
,[DllImport("mydll.dll")]但我不知道如何声明该函数.
public static extern char* test(char* a); 显然不起作用,因为C#不支持像C这样的指针.
那么我应该如何将一个字符串传递给这个C函数并让它返回一个字符串呢?
您正在寻找MarshalAs属性:
[DllImport("mydll.dll")]
static public int test([MarshalAs(UnmanagedType.LPStr)]String a);
Run Code Online (Sandbox Code Playgroud)
至于返回动态分配的C字符串,不好主意.你如何可靠地解除分配字符串?这是内存泄漏的秘诀.在C#中分配一个字节数组,将其固定并将其传递给C代码及其大小,以便C代码可以将结果复制到其中.然后使用转换为字符串System.Text.Encoding.ASCII.GetString().