Такая вот проблема. Создается некая управляемая (на 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");
Я подозреваю, что такая ерунда происходит именно из-за неуправляемого кода.. Есть ли какие-нибудб другие идеи?