顽强的兽:一个二维字符阵列,结构内,在非托管DLL的腹(Indomitable beast: a 2

2019-09-19 20:14发布

有束紧腰我和冒险进入传统的土地,其砍死,对调用和编组每一种类型的野兽,我现在面前的生物如此激烈忍受的,据我可以从我的辛苦调查brethern-IN-告诉武器,不是一个单一的代码战士已经罚站。

下面是详细信息。 我试图通过一个二维字符数组(在C#),在结构内部,一个C DLL(没有源代码),它必须能够进行更改2D阵列。

C语言结构:

typedef struct s_beast
{
    bool fireBreathing;
    char entrails[30][50];
} Beast;

以下是我迄今为止在C#中,但它(错误地)一维数组:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct Beast
{
    public BOOL fireBreathing;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 30 )]
    public char [] entrails;
}

谁愿意花刺在这一点,为了我的缘故,我的brethern的缘故,又为子孙后代着想,一劳永逸杀死这个庞然大物?

Answer 1:

互操作是不是我的套房,但是C风格的多维度阵列基本上只是在单维数组句法差异。

这样的事情可能工作:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct Beast
{
    public BOOL fireBreathing;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1500 )] /* 50x30 */
    public char [] entrails;
}

public class TamedBeast
{
    public Beast WildBeast;
    public char[30][50] entrails
    {
      var 2dEntrails = new char[30][50];
      var position = 0;
      for (int first = 0; first <30; first++)
      {
         for (int second = 0; second <50; second++)
         {
             2dEntrails[first][second] = WildBeast.entrails[position++];
         }
      }
      return 2dEntrails;
    }
}

免责声明:从内存中未测试的代码,但它应该给一些想法。 这可能缓存二维数组,我不只是作为兽初始刺,再加上同步更新。 这可以用MEM复制操作每个第二维可能大大加快。



文章来源: Indomitable beast: a 2d char array, inside a structure, in the belly of an unmanaged dll