2013-12-17 3 views
0

C 랩퍼를 작성한 C++ 기반 바이너리 (dll)가 있습니다. dll은 데이터 수신이 끝나면 콜백을 시작하는 webservice를 사용합니다. 나는 필요한 데이터를 생성하기 위해 웹 서비스가 사용하는 플레이어 이름의 매개 변수를 가진 메소드를 호출한다. 플레이어가 유효하면 콜백이 성공적으로 실행되고 데이터를 잘 사용할 수 있습니다. 플레이어가 유효하지 않으면 C++ 바이너리 내에서 Null 참조 예외가 발생합니다. 이상한 점은 C++ 코드를 실행하면 콜백이 제대로 실행된다는 것입니다.C++에서 C# 래퍼 Null 예외 오류

친구와 저는 가능성이 큰 문제는 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

내장 유형 매개 변수를 null 허용 유형으로 변경하면 문제가 해결됩니까? 'uint'에'null '을 할당하려고 할 때마다 엉망이라고 생각합니다. – Anthony

답변

1

anthony-arnold의 의견을 바탕으로 C++ 측에서 구조 매개 변수에 NULL을 전달하려고 할 수 있습니다 (원시 코드와 비슷한 문제가 있음). 구조체를 대신 (ref 키워드없이) IntPtr 매개 변수로 만들고 0인지 확인하십시오. 그들은 제로하지 않는 경우 당신은 너무처럼 밖으로 구조체를 얻을 수 있습니다 :

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 
    } 
} 

나는 (이 0로 설정해야 C++ 측면에서 통과 NULL로 uint 매개 변수에 필요한해야한다고 생각하지 않습니다 ?) (내가 틀렸다면 나는 이것을 잘 모르겠다.