5

我看了又看,尝试了所有我能想到或发现的建议。我仍然没有任何运气获得我需要的数据。

我正在使用第三方 DLL,我相信它是用 C 编写的。我需要在 C# 中访问此 DLL 中的函数。在大多数情况下,我有这个工作,除了一个功能。我遇到问题的函数具有以下标题:

uint queryNumOfServers(USHORT *NumOfServers, char ServerNames[8][16]);

我在我的 C# 应用程序中声明了以下内容

[DllImport("client.dll", CharSet=CharSet.Ansi]
public static extern uint queryNumOfServers(ref short numberofServer, StringBuilder serverNames);

我这样称呼它:

StringBuilder serverNames = new StringBuilder(128);
short numServers = -1;
queryNumberOfServers(ref numServers, serverNames);

问题是,虽然 numberOfServers 返回等于 4,但我在 serverNames 中只得到一个名称。我已经在一个小型 C 程序中测试了上述 C 函数。我得到了 numberOfServer = 4 但我也得到了 4 个名字。


我尝试了以下但没有成功:

[DllImport("client.dll", CharSet=charSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern uint queryNumOfServers(ref short numberOfServer,[MarshalAs(UnmanagedType.LPStr)] string serverNames);

称之为

string serverNames = new string('\0', 128);
queryNumOfServers(ref numServers, serverNames);

使用此选项不会更改 serverNames。


开发环境为 Visual Studio 2008。

4

2 回答 2

3

经过大量搜索和拉头发,这是对我有用的解决方案。

在我的 C# 应用程序中将函数头声明为:

[DllImport("client.dll", CharSet = CharSet.Ansi)]
public static extern uint queryNumOfServers(ref short numberOfServers, [MarshalAs(UnmanagedType.LPArray)] byte[,] serverNames);

然后调用如下:

byte[,] serverNames = new byte[8,16];
short numServers = -1;
queryNumberOfServers(ref numServers, serverNames);

这将返回一个双索引字节数组。从这里我使用 Buffer.BlockCopy() 和 Encoding.UTF8.GetString() 将我的字节数组转换为字符串数组。

于 2013-09-16T22:13:54.470 回答
0

我会使用 [StructLayout(LayoutKind.Sequential...]and [MarshalAs(UnmanagedType.ByValTStr...]

这里有两个很好的例子:

编组 C 二维固定长度字符数组

将 C++ 二维固定长度 char 数组编组为结构成员

于 2013-09-09T19:56:50.023 回答