Exceptions. Из Windows в Linux
От: Аноним  
Дата: 03.12.12 06:41
Оценка:
Привет, ситуация такая.
Портирую приложение с Windows на Linux.
Часть кода нативная, большая часть на C#.
Обработка ошибок через SEH (в нативном коде выбрасываю RaiseException с собственным кодом исключения, в C# ловлю SEHException, можно и в обратном направлении).
Управляемый код на C# в Linux под Mono, нативные dll под Windows в нативные so.
Чем заменить SEH в Linux, так чтобы выбрасывались в нативном коде, а ловились в коде на C# под Mono и наоборот (выбрасывать и ловить нужно простые коды исключений).
Re: Exceptions. Из Windows в Linux
От: wildwind Россия  
Дата: 11.12.12 18:09
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Чем заменить 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.

Re: Exceptions. Из Windows в Linux
От: Аноним  
Дата: 14.12.12 23:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет, ситуация такая.

А>Портирую приложение с 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.