在多线程环境中从C#调用Delphi DLL时发生访问冲突

彼得·克

我正在使用P / Invoke从C#调用用Delphi XE2编写的DLL函数。从单个线程顺序进行调用时,它似乎正在工作。但是,当多个线程正在调用该函数时,C#主机应用程序System.AccessViolationException似乎是随机抛出的

为什么下面的代码会触发访问冲突,我该如何解决?

再现问题的最小Delphi库代码:

library pinvokeproblem;

{$R *.res}

uses Windows, SysUtils;

procedure Test(const testByte: byte); stdcall;
begin
  OutputDebugString(PWideChar(IntToStr(testByte)));
end;

exports Test;

end.

重现此问题的最低C#主机应用程序代码:

[DllImport(
    "pinvokeproblem.dll",
    CallingConvention = CallingConvention.StdCall,
    EntryPoint = "Test")]
private static extern void Test(byte testByte);

public static void Main(string[] args)
{
    for (int i = 1; i <= 1000; i++) // more iterations = better chance to fail
    {
        int threadCount = 10;
        Parallel.For(1, threadCount, new ParallelOptions { MaxDegreeOfParallelism = threadCount }, test =>
        {
            byte byteArgument = 42;
            Test(byteArgument);
            Console.WriteLine(String.Format("Iteration {0}: {1}", test, byteArgument));
        });
     }
}

附加信息:

  • 平台是x64 Windows7。为.NET 4.0中的x86构建的C#主机应用程序,为32位编译的Delphi DLL。

  • 在多线程Delphi主机应用程序中使用时,该库似乎运行正常。

  • 带有功能签名的DLL的MSVC版本extern __declspec(dllexport) void __stdcall Test(char testByte)在C#主机上可以正常工作(这表明它特定于Delphi)。

  • 如果库函数没有返回值(void)和参数,则代码不会失败

  • 将两个代码中的调用约定更改为都cdecl无济于事。

任何想法将不胜感激。

昂德里·凯尔

所有你需要做的是设置IsMultiThreadTrue(在你的DLL的主要一线begin..end块)的内存管理器切换到线程安全模式:

IsMultiThread := True;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

调用dll函数时发生C ++访问冲突

调用dll时c#中的访问冲突错误

调用glGetString时发生访问冲突错误

从文件读取时发生C ++访问冲突

从 Delphi 调用 C++ DLL 时的访问冲突

从C#调用C ++函数时发生访问冲突异常

C ++多线程环境中的内存访问

调用DLL时发生奇怪的内存访问

在C ++中“调整大小”数组时发生访问冲突

在窗体上移动按钮时发生Delphi访问冲突

openGL-调用glMatrixMode(...)时发生访问冲突

在文件中写入char数组时发生访问冲突

C ++:读取Lambda捕获的指针时发生访问冲突

从Delphi“访问冲突”中正确调用DLL中的C ++函数

使用 OpenGL 时 nvoglv64.dll 中的访问冲突

访问C#中的多线程列表时的竞争条件

使用C#访问C ++ DLL时出现间歇性访问冲突

在delphi7中使用“记录”类型时发生访问冲突

访问过程库中的单例对象时发生访问冲突

读取C中的字符串时发生访问冲突错误

从C中的二进制文件读取字符串时发生访问冲突

尝试从另一个单元调用过程时发生访问冲突

Qt-在QTableWidget中添加一行时发生奇怪的访问冲突

释放另一个窗体的OnDestroy事件中的窗体时发生访问冲突

在Windows 7中调试Windows.Devices.Sensors项目时,立即发生访问冲突

在DLL中调用外部函数时出现“访问冲突”错误(在unzipper.dll中解压缩)

delphi dll地址处的访问冲突

0x7C29F7A9 ( ucrtbased.dll ) 在 (Project3.exe):0xC0000005 处抛出异常:写入位置 0x00740000 时发生访问冲突

使用Ctypes与Fortran DLL进行接口时发生访问冲突