Acess Violation Protected Memory при редактировании переданного IntPtr из C # в собственную неуправляемую dll C ++ в net Framework 4.5 и более поздних версиях - PullRequest
2 голосов
/ 11 мая 2019

Я использую функции C ++ DLL, вызывая DLLImport в C #, код C # управляет памятью, при использовании .Net Framework 4 все работало нормально, но при попытке обновления до новейших версий или даже при переключении на сеть ядро, когда я вызываю функции в C ++ DLL, которая использует IntPtr, заданную из кода C #, а затем редактирую данные в этой области памяти, я получаю нарушение доступа для чтения / записи в защищенной памяти, чего не происходило в сетевой среде 4.

Попытка поиска похожих проблем, но не смогла идентифицировать людей, у которых была такая проблема, потому что код не изменился, только сетевая среда, а также не нашла, где она изменилась, что делает, что больше не работает.

Это один звонок, который дает мне нарушение прав доступа

[DllImport("ocgcore", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern void set_player_info(IntPtr pduel, Int32 playerid, Int32 lp, Int32 startcount, Int32 drawcount);

Это код C ++ в DLL, который получает вызов C #

extern "C" DECL_DLLEXPORT void set_player_info(ptr pduel, int32 playerid, int32 lp, int32 startcount, int32 drawcount) {
    duel* pd = (duel*)pduel;
    if(lp > 0)
        pd->game_field->player[playerid].lp = lp;
    if(startcount >= 0)
        pd->game_field->player[playerid].start_count = startcount;
    if(drawcount >= 0)
        pd->game_field->player[playerid].draw_count = drawcount;
}

Этот другой код не доставляет мне проблем даже при использовании новейшего сетевого ядра. C # вызов

public static extern IntPtr create_duel(UInt32 seed);
[DllImport("ocgcore", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]

C ++ код, который называется

extern "C" DECL_DLLEXPORT ptr create_duel(uint32 seed) {
    duel* pduel = new duel();
    duel_set.insert(pduel);
    pduel->random.reset(seed);
    return (ptr)pduel;
}

Я ожидаю, что он будет работать на новейших версиях ядра .net и .net, но по какой-то причине, если я использую что-то более новое, чем .Net Framework 4.0, он просто не работает, что дает мне это нарушение прав доступа к защищенным память.

Кратко пояснить:

csproj с: <TargetFramework>net40</TargetFramework> Отлично работает.

csproj с: <TargetFramework>net45</TargetFramework> или любой другой версией выше 4.0 не работает, создавая ту же проблему в том же месте (не во время компиляции, а во время выполнения), включая net core.

...