1

我正在尝试从 C# 调用第 3 方 DLL,但在编组一些字符串数据时遇到了麻烦。DLL 是用 Clarion 编写的,我对所使用的数据类型不是很熟悉。具体来说,规范有一个我无法工作的功能的签名:

Bool QuerySoftwareVersion( cstring* version)  // edited documentation typo
//Returns Software version (20 character cstring).  

我假设 cstring 只是一个以 null 结尾的字符串,但我无法让它out char[] version在我的定义中使用。有人知道处理这个问题的正确方法吗?

编辑:实际上,到目前为止我所发现的表明 Clarion 中的 cstring 确实只是一个以空字符结尾的字符串。

更新:我更新了问题的标题和详细信息,因为事实证明 DLL 文档中有错字。有问题的version参数被声明为 type cstring*not cstringt*. And in Clarion,cstring` 显然只是一个 c 风格的、以 null 结尾的字符串。所以编组不应该那么复杂,因为他们声称它是用 C 调用约定编写的。有没有人成功地 p/invoked 通过引用参数传递字符串的 Clarion DLL?

4

3 回答 3

0

I've never called into Clarion, but I've got a DLL (in C) that is called from both Clarion and C#, and I'd interop that as:

[DllImport("clarionlib.dll", CharSet=CharSet.Ansi,
CallingConvention = CallingConvention.Cdecl,
ExactSpelling=true, EntryPoint="QuerySoftwareVersion")] static extern
            bool QuerySoftwareVersion(StringBuilder sName);

Note also that the StringBuilder parameter you pass has to be sized up to the maximum expected return size (pardon my C#, I'm sure there's a shorter equivalent):

System.Text.StringBuilder buffer;
buffer = new System.Text.StringBuilder();
buffer.EnsureCapacity(21);
QuerySoftwareVersion(buffer);
string myString = buffer.ToString();
于 2009-07-01T23:11:17.933 回答
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);

这对我有用 - 我不确定这是否安全。我希望这可以帮助你。

于 2010-11-19T16:28:30.687 回答
-1

尝试使用 StringBuilder:

[DllImport("mylibrary.dll")]
static extern bool QuerySoftwareVersion([Out] StringBuilder version);
于 2009-01-22T17:50:20.190 回答