У меня проблема с получением стороннего .dll, который использует неуправляемые обратные вызовы для работы в проекте ac # forms.Первоначально программа зависала после первого вызова обратного вызова.Однако ответ здесь помог мне решить эту проблему (Cdecl был правильным соглашением о вызовах).Определение обратного вызова в C # выглядит следующим образом:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void FrameDelegate(IntPtr lpContext, IntPtr bpData, int nDataSize, int nChannel, int isKeyFrame, int nFrameCnt);
Фактический обратный вызов выглядит следующим образом:
public void FrameDelegate(IntPtr lpContext, IntPtr bpData, int nDataSize,
int nChannel, int isKeyFrame, int nFrameCnt)
{
lock (ChannelStats)
{
ChannelStats.TotalSize += nDataSize;
ChannelStats.CurrentFileSize += nDataSize;
ChannelStats.FrameCount++;
}
UpdateStatistics();
}
И функция статистики обновления:
private void UpdateStatistics()
{
if (this.InvokeRequired)
{
this.Invoke(new UpdateDelegate(UpdateStatistics));
}
else
{
lock (ChannelStats)
{
FrameCapturedLabel.Text = string.Format("Frames Captured: {0}", ChannelStats.FrameCount);
TotalCapturedLabel.Text = string.Format("Total Captured: {0} [MB]", (double)ChannelStats.TotalSize / 1000000.0);
CurrentFileLabel.Text = string.Format("Current File Size: {0} [MB]", (double)ChannelStats.CurrentFileSize / 1000000.0);
FileCountLabel.Text = string.Format("File Count: {0}", ChannelStats.FileCount);
}
}
}
Код выполняетсяуспешно для случайного числа кадров (обычно 5-15), прежде чем он падает, за исключением нарушения прав доступа.К сожалению, это выполняется на удаленной встроенной системе, и поэтому у меня нет под рукой отладчика, который бы мне помог.Также обратите внимание:
- Запуск вышеуказанного кода без вызова UpdateStatistics () работает нормально.
- Запуск аналогичной программы в консольном приложении C32 Win32 работает нормально.
Итак, мой вопрос: есть ли намеки на то, что может быть причиной нарушения доступа?Является ли блокировка в коде разумной или она полностью отключена?
Любые входные данные приветствуются!
Edit
Определяется переменная ChannelStatsследующим образом:
private class RecordStatistics
{
public Int64 TotalSize { get; set; }
public Int64 CurrentFileSize { get; set; }
public Int64 FileCount { get; set; }
public Int64 FrameCount { get; set; }
public RecordStatistics()
{
TotalSize = 0;
CurrentFileSize = 0;
FileCount = 0;
FrameCount = 0;
}
}
RecordStatistics ChannelStats;