用于处理C ++类型的类型编组

时间:2011-01-07 08:56:16

标签: c# c++ winapi dll marshalling

我想通过C#调用c ++函数(在win32 .dll中)。 像这样的c ++函数:

bool pack(BYTE * messageFields[]);

函数想要在输入参数的某些索引处填充一些数据(例如,字符串或byte [])。 那么请告诉我如何在C#.NET中编组?我尝试了很多类型,但我的参数出错或没有效果!

C#代码必须打开本机.DLL:

[DllImport("c:\\theDllName.dll")]
        public static extern bool pack( // what is here? )

1 个答案:

答案 0 :(得分:1)

System.Byte []正是您可能正在寻找的。

抱歉没见到你有BYTE * ...... []。

一些代码

extern "C" UNMANAGEDCPP_API int fnUnmanagedCpp(BYTE* test[], int nRows, int nCols)
{
    //do stuff
    std::cout << "called!" << std::endl;

    for ( int i = 0; i < nRows; ++i )
    {
        for ( int j = 0; j < nCols; ++j )
        {
            std::cout << int ( test[i][j] ) << std::endl;
        }
    }

    test[0][0] = 23;

    return 0;
}

在C#中:

   [DllImport("UnmanagedCpp.dll", CallingConvention=CallingConvention.Cdecl)]
   public static extern int fnUnmanagedCpp(IntPtr[] buffer, int nRows, int nCols );

   public static IntPtr[] Marshall2DArray(byte[][] inArray)
   {
       IntPtr[] rows = new IntPtr[inArray.Length];

       for ( int i = 0; i < inArray.Length; ++i )
       {
           rows[i] = Marshal.AllocHGlobal(inArray[i].Length * Marshal.SizeOf(typeof(byte)));
           Marshal.Copy( inArray[i], 0, rows[i], inArray[i].Length );
       }

       return rows;
   }

   public static void Copy2DArray( IntPtr[] inArray, byte[][] outArray )
   {
       Debug.Assert(inArray.Length == outArray.Length);

       int nRows = Math.Min( inArray.Length, outArray.Length );

       for (int i = 0; i < nRows; ++i)
       {
           Marshal.Copy(inArray[i], outArray[i], 0, outArray[i].Length);
       }
   }

   public static void Free2DArray(IntPtr[] inArray)
   {
       for (int i = 0; i < inArray.Length; ++i)
       {
           Marshal.FreeHGlobal(inArray[i]);
       }
   }

    static void Main(string[] args)
    {
        byte[][] bTest = new byte[2][] { new byte[2] { 1, 2 }, new byte[2] { 3, 4 } };

        IntPtr[] inArray = Marshall2DArray(bTest);

        fnUnmanagedCpp(inArray, 2, 2);

        Copy2DArray(inArray, bTest);
        Free2DArray(inArray);

        System.Console.WriteLine(bTest[0][0]);
    }

我希望这会有所帮助,也许有另一种更好/更简单的方法来做到这一点。请注意,该代码仅用于“插图”,可能包含错误。

基本上,一个IntPtrs数组传递并手动编组......