我有一个基于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);
节日快乐!
答案 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(?)(我不确定这个,有人纠正我,如果我'我错了。)