C ++到C#Wrapper Null异常错误

时间:2013-12-17 00:07:05

标签: c# c++ interop wrapper

我有一个基于C ++的二进制文件(dll),我已经编写了一个C#Wrapper。该DLL使用一个Web服务,它在完成数据获取后触发回调。我使用播放器名称的参数调用一个方法,webservice使用该参数生成我需要的数据。如果播放器有效,则回调会成功触发,我可以正常使用数据。如果播放器无效,我会从C ++二进制文件中获得Null Reference异常。奇怪的是,如果我运行C ++代码,它运行回调就好了。

我和朋友推断出可能的问题是从二进制文件中传入了null并且C ++可以处理它但C#不能处理它?鉴于它在C ++中运行良好,它不太可能成为二进制文件本身的问题。回调的转换是否准确?

C ++回调

void (game_CALLBACK *on_game_info)(const game_player_array *teammates, unsigned int teammates_array_size,
                                          const game_player_array *opponents, unsigned int opponents_array_size,
                                          const game_hero_array *team_banned_hero,
                                          unsigned int team_banned_hero_size,
                                          const game_hero_array *opponent_banned_hero,
                                          unsigned int opponent_banned_hero_size,
                                          const char *message);

C#回调

 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
    public delegate void game_services_callback_on_game_info(
        ref game_summoner_array teammates, uint teammates_array_size,
        ref game_summoner_array opponents, uint opponents_array_size,
        ref game_champion_array team_banned_hero, uint team_banned_hero_size,
        ref game_champion_array opponent_banned_hero, uint opponent_banned_hero_size,
        [In] [MarshalAs(UnmanagedType.LPStr)] string message);

节日快乐!

1 个答案:

答案 0 :(得分:1)

基于anthony-arnold的评论,可能是C ++方面试图将NULL传递给结构参数(我在本机代码中遇到了类似的问题)。使结构更改为IntPtr(不带ref关键字)并检查它们是否为零。如果它们不为零,你可以像这样得到一个结构:

private static void Handler(IntPtr structPointer)
{
  if (structPointer == IntPtr.Zero)
  {
    // struct is NULL (0)
  }
  else // valid struct
  {
    MyStruct structure;
    structure = System.Runtime.InteropServices.Marshal.PtrToStructure(
      structPointer,
      typeof(MyStruct));
    // do work with structure
  }
}

我不认为uint参数应该需要它,因为从C ++端传递NULL应该将它们设置为0(?)(我不确定这个,有人纠正我,如果我'我错了。)