我使用以下方法获得了一个外部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 ++方法?
答案 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);