Я использую функции 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.