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++ 函数的主要内容,如果未能解决你的问题,请参考以下文章