Исключения типа OutOfMemoryException, StackOverflow.
От: hexman  
Дата: 03.08.06 13:38
Оценка:
Такая вот проблема. Создается некая управляемая (на C#) "обертка" неуправляемых функций. Каждая функция описывается примерно так:

[DllImport("aaaaa.dll")]
public static long AAAA_BBBB
(
    long ccccc
);


Причем реально таких функций очень много, с совершенно разными параметрами, и не все их можно маршализовать стандартным (атрибут [MarshalAs...]) маршалингом. Для некоторых из них используется "ручной" маршалинг, реализованный на Manage C++, то есть, к примеру:

[DllImport("aaaaa.dll", EntryPoint="AAAA_BBBB")]
private static long AAAA_BBBB_unmng
(
    ...
);

public static long AAAA_BBBB
(
    ...
)
{
    // Здесь делается маршалинг входящих параметров.
    // Можем спокойно использовать обычные (unsafe) указатели.

    // Вызывается сама функция
    AAAA_BBBB_unmng(...);

    // Здесь делается маршалинг выходящих параметров.
}


То есть из клиентского (на C#) кода вызывается AAAA_BBBB(...), она преобразует входящие параметры из управляемых в неуправляемые и вызывает AAAA_BBBB_unmng(...).

И все вроде хорошо, все работает. Однако, когда в одном большом проекте используется много таких функций, иногда возникают исключения OutOfMemoryException, StackOverflowException, NullReferenceException. Причем они возникают не всегда, а в примерно половине запусков программы. Во второй половине все отлично работает. Самое интересное, что возникают они еще и на разных строчках кода: то в неуправляемой функции (типа AAAA_BBBB_unmng), то вообще при действиях типа:

mListView.Items.Add("Some string");


, где mListView — стандартный ListView.

Естественно, ни о каком реальном OutOfMemory речи быть не может, так как выделяется совсем немного памяти: 30-50 kB на всю программу, так же как и нету null'ов в строке типа
mListView.Items.Add("Some string");



Я подозреваю, что такая ерунда происходит именно из-за неуправляемого кода.. Есть ли какие-нибудб другие идеи?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.