从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);
如果有任何有用的其他信息,请与我们联系。谢谢!
答案 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