C# 非托管DLL的访问冲突

C# 非托管DLL的访问冲突,c#,timer,pinvoke,unmanaged,access-violation,C#,Timer,Pinvoke,Unmanaged,Access Violation,目前,我们使用供应商提供的非托管DLL,允许我们访问特定的工具。在头文件中指定感兴趣的特定函数,如下所示: extern "C" short CCONV acq_get_board_count (); 在我的申请中,我有pinvoke声明: public class bograms { [DllImport("bograms.dll", EntryPoint = "acq_get_board_count", CallingConvention = CallingConvention.S

目前,我们使用供应商提供的非托管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
        }
    }
}
计时器的第一个滴答声,它得到零个板(可能是因为硬件尚未完成初始化),并将这两条消息打印到控制台。然而,在第二个刻度中,我在
bograms.dll
中得到一个APPCRASH错误0xc0000005,我发现这是一个访问冲突错误。在调用周围放置try/catch不会捕获错误。第一行在控制台中,第二行不在控制台中。在调试转储文件时(就我有限的知识而言),此调用似乎会发生错误

我的pinvoke声明错了吗?这是一个如此简单的函数,我不敢相信它会是这样,但我是否遗漏了什么?由于计时器导致的线程是否导致某种类型的问题

我猜第一次调用会使它进入某种状态,导致第二次调用失败,特别是考虑到幕后正在进行的硬件初始化。如果是这种情况,是否有任何方法卸载驱动程序DLL,以便将其重置回其应处于的初始状态


或者您还可以考虑其他事情吗?

一件立即浮现在脑海中的事情是API是否可以跨线程安全使用。
System.Threading.Timer
回调是在
ThreadPool
线程上进行的,因此每次调用都可能不同。某些API具有线程关联性要求,这意味着它们只能从单个线程调用。相反,如果同时发生对同一API的两个调用,则仍然可能存在一些并发问题。最后,您可能会发现问题与线程无关。我只是想给出一个可能的解释。

我知道这已经有一段时间了,但我在过去的一个月里一直在测试这个理论,我认为你对线程关联的看法是正确的,特别是因为我使用计时器来完成KeepAlive任务。仪器的驱动程序必须在第一次调用时存储一位信息,在第二次调用(发生在不同的线程上)时,它尝试访问该位内存,但因违反而失败。但是,我不知道如何解决这个问题。。。我是否使用
Thread.Sleep()
将计时器方法更改为单循环以延迟每个KeepAlive?我听说过关于睡觉的不好的事情……你有过这样的经历吗?我也有同样的问题。