我正在尝试从C#调用第三方DLL,并且我在编组某些字符串数据时遇到问题。 DLL是用Clarion编写的,我对使用的数据类型不是很熟悉。具体来说,规范有一个我无法工作的功能的签名:
Bool QuerySoftwareVersion( cstring* version) // edited documentation typo
//Returns Software version (20 character cstring).
我假设cstring只是一个以空字符结尾的字符串,但我无法在定义中使用out char[] version
。有人知道处理这个问题的正确方法吗?
编辑:实际上,到目前为止,我发现Clarion中的cstring确实只是一个以空字符结尾的字符串。
更新:我已经更新了问题的标题和详细信息,因为事实证明DLL文档中存在拼写错误。有问题的version
参数被声明为类型cstring*
而不是cstringt*. And in Clarion,
cstring`显然只是一个c风格的,以null结尾的字符串。所以编组不应该那么复杂,因为他们声称它是用C调用约定编写的。有没有人成功p /调用通过引用参数传递字符串的Clarion DLL?
答案 0 :(得分:0)
我从来没有打电话给Clarion,但我有一个从Clarion和C#调用的DLL(在C中),我将其作为:
[DllImport("clarionlib.dll", CharSet=CharSet.Ansi,
CallingConvention = CallingConvention.Cdecl,
ExactSpelling=true, EntryPoint="QuerySoftwareVersion")] static extern
bool QuerySoftwareVersion(StringBuilder sName);
另请注意,您传递的StringBuilder参数必须调整到最大预期返回大小(请原谅我的C#,我相信它的等效时间更短):
System.Text.StringBuilder buffer;
buffer = new System.Text.StringBuilder();
buffer.EnsureCapacity(21);
QuerySoftwareVersion(buffer);
string myString = buffer.ToString();
答案 1 :(得分:0)
我在DLL API中使用CString引用取得了一些成功:
SCODE WINAPI Test( const CString& str );
我使用以下C#代码导入:
[DllImport("CBData.Dll")]
public static extern int Test( [MarshalAs(UnmanagedType.LPStr)] ref String str );
这个C#代码可以调用:
String b = "Some text";
int x = Test(ref b);
这对我有用 - 我不确定这是否安全。我希望这会对你有所帮助。
答案 2 :(得分:-1)
尝试使用StringBuilder:
[DllImport("mylibrary.dll")]
static extern bool QuerySoftwareVersion([Out] StringBuilder version);