【问题标题】:Pass char** by reference from c# to unmanaged C++通过引用从 c# 将 char** 传递给非托管 C++
【发布时间】:2015-10-12 18:24:48
【问题描述】:

这是 C# 代码。

namespace CameraTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] lst = new string[10];
            for (int i = 0; i < 10; i++)
            {
                lst[i] = new string(' ', 33);
            }
            bool sync = true;
            bool ret = CameraCalls.CAM_EnumCameraEx(sync, lst, 10, 33);

        }
    }

    public static class CameraCalls
    {
        [DllImport("CamDriver64.dll")]
        public static extern bool CAM_EnumCameraEx(bool sync,
                                                   [MarshalAs(UnmanagedType.LPArray)]
                                                   string[] lst, 
                                                   long maxCam, 
                                                   long maxChar);
    }
}

非托管方法是这样的。

BOOL WINAPI CAM_EnumCameraEx(BOOL bSynchronized, char **ppCameraList, long lMaxCamera, long lMaxCharacter);

该方法写入传入的字符串数组。有没有办法从 c# 调用这个方法并使非托管代码能够写入字符串数组?

【问题讨论】:

标签: c# c++ pinvoke


【解决方案1】:

感谢 Remus Rusanu 链接有答案。我所要做的就是用 lst 参数上的 [In, Out] 进行装饰。

namespace CameraTest
{
    class Program
    {
        static void Main(string[] args)
        {
            int maxCam = 10,
                 maxChar = 33;

            var lst = (new object[maxCam]).Select(o => new string(' ', maxChar)).ToArray();
            bool sync = true;
            bool ret = CameraCalls.CAM_EnumCameraEx(sync, lst, maxCam, maxChar);

        }
    }

    public static class CameraCalls
    {
        [DllImport("CamDriver64.dll")]
        public static extern bool CAM_EnumCameraEx(bool sync,
                                                   [In, Out]
                                                   string[] lst, 
                                                   long maxCam, 
                                                   long maxChar);
    }
}

【讨论】:

  • 刚刚用StringBuilder[] 测试了我的答案并得到堆栈不平衡错误,所以我认为@HansPassant 是对的。仍然很高兴我创建一个已经传播的任何对象的新数组的方式:)
  • 好吧,直到我添加了 [In, Out] 它不起作用,它要么不设置字符串,要么抛出内存异常。因此,如果 [In, Out] 错误,从外部方法获取数据的正确方法是什么?我应该使用什么来代替 long?
  • 我不愿意花时间帮忙。您已经回答了自己的问题,这表明您已经下定决心。
猜你喜欢
  • 1970-01-01
  • 2013-02-19
  • 2011-02-27
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-02
相关资源
最近更新 更多