如何通过P / Invoke封送cstring *?

时间:2009-01-22 17:41:11

标签: c# pinvoke

我正在尝试从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?

3 个答案:

答案 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);