内存AccessViolationException错误从C#调用DLL

时间:2008-10-17 13:40:37

标签: c# c++

从C#调用编译的DLL时遇到奇怪的内存读/写错误。我使用DllImport来获取我们需要的函数的句柄,它将返回值写入到int的参数指针(即int * out)。在线程中多次调用此函数,并在第一个线程的执行生命周期内成功运行。但是,如果在第一个完成后启动另一个线程,则对外部dll的调用将引发AccessViolationException。由于第一个线程的多次调用成功执行,我认为这与第一个不释放指向相关整数参数(?)的指针的线程有关。如果是这样,我怎么能明确释放那个记忆?或者,也许有人对这里可能发生的事情有不同的洞察力?非常感谢你。

编辑:丹尼要求更多具体细节,我很高兴有义务。这是调用外部例程的地方:

    int success = -1;
    unsafe
    {
        int res = 0;
        int* res_ptr = &res;
        int len = cmd.ToCharArray().Length;
        int* len_ptr = &len;
        CmdInterpreter(ref cmd, len_ptr, res_ptr);
        success = *res_ptr;
    }

其中CmdInterpreter定义为:

    [DllImport("brugs.dll", EntryPoint="CmdInterpreter", 
        ExactSpelling=false, CallingConvention = CallingConvention.StdCall)]
    public static unsafe extern void CmdInterpreter(ref string cmd, int *len, int *res);

如果有任何有用的其他信息,请与我们联系。谢谢!

2 个答案:

答案 0 :(得分:1)

鉴于问题仅在涉及多个线程时发生,可能是命令解释器DLL正在使用某种线程本地存储并且执行不正确。它也可能与第二个线程(产生错误的线程)的COM初始化状态有关。

如果您启动新线程并在在第一个/主要线程上调用DLL之前调用DLL ,会发生什么情况会很有趣。如果它工作,那可能支持线程局部存储理论。如果失败,那将支持COM状态理论。

答案 1 :(得分:0)

可能是[DllImport]。如果您发布[DllImport]签名和DLL的ptototype,也许我们可以发现问题。

我读到Managed,Native和COM Interop团队在CodePlex上发布了PInvoke Interop Assistant。 http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120