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

时间:2018-08-09 10:38:07

标签: c# c++ pinvoke

我的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 ++可重新分发而没有成功。你有什么建议吗?

谢谢

Davide

1 个答案:

答案 0 :(得分: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参数也有同样的道理(如有必要)。