c # — ошибка сегмента с Dotnetcore и обратными вызовами

Во-первых, этот вопрос следует из System.DllNotFoundException: невозможно загрузить DLL с ядром dotnet.

Нам удалось полностью реализовать взаимодействующий фасад, который работает в окнах. Однако у нас были проблемы с запуском в Linux. Мы продолжаем получать ошибки сегмента случайным образом. Иногда это работает в течение нескольких минут или часов, но в конечном итоге он умирает.
Вот некоторые фрагменты кода.
N.B OnNotificationFromUnmanaged делает больше, чем просто журнал, однако мы обнаружили, что независимо от того, что в нем содержится, даже пустота, это все равно точка, в которой приложение умирает.

C #

private void OnNotificationFromUnmanaged(ZWNotification notification)
{
Console.WriteLine ( "OnNotificationFromUnmanaged");
}

var callback = Marshal.GetFunctionPointerForDelegate((ManagedNotificationsHandler)OnNotificationFromUnmanaged);
Console.WriteLine($"Callback Ptr = {callback}");

Interop.RegisterCallback(callback);
GC.Collect();//all calls should now segfault should the callback get GC'd

CPP

#ifdef __GNUC__
#define EXPORT extern "C"#define CC
#else
#define EXPORT extern "C" __declspec (dllexport)
#define CC __stdcall
#endiftypedef void(CC *CallBackDelegate)(ZWNotification);

CallBackDelegate cb; //set by another functionvoid OnNotification ( Notification const* _notification, void* _context)
{

ZWNotification zw;
...init stuff here

Log::Write( LogLevel_Info, "Callback to C#, %p", cb);

if ( cb)
cb ( zw);
Log::Write( LogLevel_Info, "Callback to C# - done");

}

При неудаче мы получаем:

2017-03-27 15: 53: 22.005 Информация, обратный вызов на C #, 0x7fe2184175fc
$

dmesg reveals
[7383.514872] dotnet [21218]: segfault at 7fe218418000 ip
00007fe218418000 sp 00007fe0ebffec88 ошибка 14

Мы заметили, что ошибка всегда происходит в диапазоне 1 Кб после окончания неуправляемого ptr, мы не уверены, что это вообще важно.
Например:

>     segfault at 7f72c17f4000 ip 00007f72c17f4000 sp 00007f718d0fac88 error 14
>     segfault at 7f1656b75000 ip 00007f1656b75000 sp 00007f152d50bc88 error 14

Любые идеи очень приветствуются! На данный момент мы потеряли желание жить.

uname -a
Linux dh-vm-ubuntu01 4.8.0-41-generic # 44 ~ 16.04.1-Ubuntu SMP
Пт 3 марта 17:11:16 UTC 2017 x86_64 x86_64 x86_64 GNU / Linux

dotnet --version
2.0.0-preview1-005416

0

Решение

Согласно комментарию @ Evk, я немного изменил код

        private ManagedNotificationsHandler Handler;

…..

Handler += OnNotificationFromUnmanaged;

var callback = Marshal.GetFunctionPointerForDelegate(Handler);
Interop.RegisterCallback(callback);

и это, кажется, исправило это.

0

Другие решения

Других решений пока нет …