2013-12-17 48 views
0

我有一個基於C++的二進制文件(dll),我寫了一個C#包裝器。該DLL使用一個web服務,它在完成獲取數據時觸發回調。我調用一個帶有參數的webservice用來生成我需要的數據的參數。如果玩家有效,回調會成功觸發,我可以很好地使用這些數據。如果播放器無效,我會在C++二進制文件中得到一個空引用異常。奇怪的是,如果我運行C++代碼,它會很好地運行回調。C++到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

是否將內在類型參數更改爲可爲空類型修復它?我認爲它試圖將'null'分配給'uint'。 – Anthony

回答

1

建立在anthony-arnold的評論上,它可能是C++端嘗試將NULL傳遞給結構參數(我曾經遇到與本機代碼類似的問題)。改爲使用結構params IntPtr(不帶ref關鍵字)並檢查它們是否爲零。如果他們不爲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 
    } 
} 

,我不認爲它應該被需要的uint參數從C++側傳遞null應該將它們設置爲0( ?)(我不確定,如果我錯了,有人糾正我)。