Привет, ситуация такая.
Портирую приложение с Windows на Linux.
Часть кода нативная, большая часть на C#.
Обработка ошибок через SEH (в нативном коде выбрасываю RaiseException с собственным кодом исключения, в C# ловлю SEHException, можно и в обратном направлении).
Управляемый код на C# в Linux под Mono, нативные dll под Windows в нативные so.
Чем заменить SEH в Linux, так чтобы выбрасывались в нативном коде, а ловились в коде на C# под Mono и наоборот (выбрасывать и ловить нужно простые коды исключений).
Здравствуйте, Аноним, Вы писали:
А>Чем заменить SEH в Linux, так чтобы выбрасывались в нативном коде, а ловились в коде на C# под Mono и наоборот (выбрасывать и ловить нужно простые коды исключений).
http://www.mono-project.com/Interop_with_Native_Libraries
As long as managed and unmanaged code use different exception handling mechanisms, exceptions must not be mixed between them.
The moral of this story: don't let exceptions propagate between managed and unmanaged code. The results won't be pretty.
Здравствуйте, Аноним, Вы писали:
А>Привет, ситуация такая.
А>Портирую приложение с Windows на Linux.
А>Часть кода нативная, большая часть на C#.
А>Обработка ошибок через SEH (в нативном коде выбрасываю RaiseException с собственным кодом исключения, в C# ловлю SEHException, можно и в обратном направлении).
А>Управляемый код на C# в Linux под Mono, нативные dll под Windows в нативные so.
А>Чем заменить SEH в Linux, так чтобы выбрасывались в нативном коде, а ловились в коде на C# под Mono и наоборот (выбрасывать и ловить нужно простые коды
исключений).
А ничем в Linux даже деление на 0 и segav не кидает исключения, а вырабатывает сигнал.
Придётся переделывать интерфейс.
...
[dllimport(...)]
static int add(out int res,int a,int b);
public static int add_wrapper(int a,int b) {
int res;
check( add(out res,a,b) );
return res
}
static void check(int status_code) {
if (status_code!=0) throw new Exception(); // ...
}
...
А еще лучше делай IPC.