System.AccessViolationException 从 C# 调用 c++ 函数

Posted

技术标签:

【中文标题】System.AccessViolationException 从 C# 调用 c++ 函数【英文标题】:System.AccessViolationException calling c++ function from C# 【发布时间】:2018-08-09 10:38:06 【问题描述】:

我的 c# 应用程序使用 dll 导入标记调用外部 DLL 的 c++ 函数:

 [DllImport("UserAuthentication.dll")]
    private static extern int Validate(string pScrambeled, string szReadable, int flToUpper, string pstrErr);

int WINAPI ValidateAMOSBS(TCHAR *pScrambeled, TCHAR* szReadable, int flToUpper, TCHAR *pstrErr)

仅在一台服务器上,并且当它被 IIS 上托管的 ASP.NET 应用程序调用时,它会引发 System.AccessViolationException。 我们尝试更改 X86、X64 编译并重新安装 VC++ 可再发行组件,但均未成功。你有什么建议吗?

谢谢,

大卫

【问题讨论】:

How to handle AccessViolationException的可能重复 【参考方案1】:

我不知道你的函数ValidateAMOSBS 是如何工作的。例如,如果最后一个参数 TCHAR 是为错误消息分配的缓冲区,那么在导入时您应该使用 StringBuilder 类型:

[DllImport("UserAuthentication.dll", CallingConvention = CallingConvention.Cdecl)]
    private static extern int Validate(string pScrambeled, string szReadable, int flToUpper, StringBuilder pstrErr);

并且你应该在调用Validate函数之前为错误信息分配缓冲区:

StringBuilder pstrErr= new StringBuilder(1000);

其他TCHAR 参数也是如此(如有必要)。

【讨论】:

以上是关于System.AccessViolationException 从 C# 调用 c++ 函数的主要内容,如果未能解决你的问题,请参考以下文章