c#DLLImport以char *作为参数调用c ++方法

时间:2015-02-13 10:31:04

标签: c# pinvoke dllimport

我使用以下方法获得了一个外部DLL(c ++):

 void _stdcall Set_Config(char* config)

我使用以下c#代码调用方法:

[DllImport(DllName,CharSet=CharSet.Auto)]
    public static extern void Set_Config(String config);

但是当我执行我的c#代码时,我得到一个访问冲突异常或System.Runtime.InteropServices.SEHException。 (我的dll是32位,我的c#编译器编译为32位)

我也尝试用Stringbuilder替换String config,但结果相同。

有人可以帮助我解决这个问题,或者给出一些示例代码我如何调用c ++方法?

2 个答案:

答案 0 :(得分:4)

CharSet.Auto将编码为UTF-16。但是你的函数接受char*,因此文本被编码为8位文本,大概是ANSI。

[DllImport(DllName, CharSet = CharSet.Ansi)]
public static extern void Set_Config(string config);

调用该函数非常简单。

我假设字符串正在传递给函数。另一方面,参数为char*而不是const char*是奇怪的。要么开发人员不知道如何使用const,要么函数确实可以将数据发送回调用者。

如果数据以其他方式流动,那么您就遇到了麻烦。您需要传递StringBuilder,但是您无法告诉DLL缓冲区有多大可用。如果数据以另一种方式流动,则代码如下所示:

[DllImport(DllName, CharSet = CharSet.Ansi)]
public static extern void Set_Config(StringBuilder config);

像这样调用函数:

StringBuilder config = new StringBuilder(256); // cross your fingers
Set_Config(config);

无论哪种方式,您都需要更清楚这个功能实际上在做什么。在您知道是否传入数据或接收数据之前,您无法调用此函数。

答案 1 :(得分:2)

你必须传递一个IntPtr,这是一个指向你的字符串的原始指针。 (根据我的回忆,Marshal.StringToBSTR

public static extern void Set_Config(IntPtr config);