【问题标题】:Marshal a C char[][] array to C#将 C char[][] 数组编组到 C#
【发布时间】:2013-09-13 09:24:39
【问题描述】:

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

我正在使用第三方 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);

使用此选项不会更改服务器名称。


开发环境为Visual Studio 2008。

【问题讨论】:

    标签: c# c++ c interop marshalling


    【解决方案1】:

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

    在我的 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() 将我的字节数组转换为字符串数组。

    【讨论】:

      【解决方案2】:

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

      这里有两个很好的例子:

      Marshalling a C 2-Dimensional fixed length char array

      Marshaling a C++ two-dimensional fixed length char array as a structure member

      【讨论】:

      • 我已尝试按照说明进行操作,但得到的只是 TypeLoadException。鉴于我试图调用的函数正在寻找一个双字符数组,我非常不清楚这将如何工作。
      猜你喜欢
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      相关资源
      最近更新 更多