В настоящее время мы используем неуправляемую DLL от поставщика, которая позволяет нам получить доступ к определенному инструменту. Конкретная интересующая функция указана в заголовочном файле следующим образом:
extern "C" short CCONV acq_get_board_count ();
В моем приложении у меня есть оператор pinvoke:
public class bograms
{
[DllImport("bograms.dll", EntryPoint = "acq_get_board_count", CallingConvention = CallingConvention.StdCall)]
public static extern short acq_get_board_count();
}
Теперь в моем коде я пытаюсь справиться с избыточностью, поэтому я создаю таймер, который пытается поддерживать работу:
public class Instrument
{
private System.Threading.Timer keepAliveTimer;
public Instrument()
{
keepAliveTimer = new Timer(new TimerCallback(this.KeepAlive), null, 0, 300000);
}
void KeepAlive(object state)
{
if(instrumentIsUninitialized) // some check that accomplishes this
{
Console.WriteLine("Some status statements"); // in console
short numBoards = bograms.acq_get_board_count();
Console.WriteLine("Initialization caught {0} boards.", numBoards); // not in console
}
}
}
Первый тик таймера, он получает ноль плат (предположительно потому, что оборудование не завершило инициализацию) и выводит оба сообщения на консоль. Тем не менее, во втором тике я получаю ошибку APPCRASH 0xc0000005 в bograms.dll
, которую я считаю ошибкой нарушения прав доступа. Установка try / catch вокруг вызова не улавливает ошибку. Первая строка находится в консоли, вторая строка - нет. При отладке файла дампа (насколько мне известно, ноу-хау) ошибка возникает при этом вызове.
Не верно ли мое утверждение pinvoke? Это такая простая функция, что я не могу поверить, что это будет, но я что-то упустил? Поток из-за таймера вызывает какие-то проблемы?
Я предполагаю, что первый вызов переводит его в некое состояние, которое приводит к сбою второго вызова, особенно если учесть, что аппаратная инициализация происходит за кулисами. Если это так, есть ли способ выгрузить драйвер DLL, чтобы он мог вернуться в исходное состояние, в котором он должен быть?
Или есть еще какие-то вещи, о которых вы можете подумать?