我只创建了一个测试WCF服务,我需要调用外部DLL。 在Visutal Studio开发服务器下一切正常。但是,当我尝试在IIS上使用我的服务时,我收到此错误:
例外: System.AccessViolationException
消息:尝试读取或写入 受保护的记忆这通常是一个 表明其他记忆是 损坏。
堆栈跟踪利用DLL的调用,如下所示。 经过大量阅读和实验后,我几乎可以肯定错误是由错误的字符串传递给被调用的函数引起的。
以下是DLL的包装器的外观:
using System;
using System.Runtime.InteropServices;
using System.Text;
using System;
using System.Security;
using System.Security.Permissions;
using System.Runtime.InteropServices;
namespace cdn_api_wodzu
{
public class cdn_api_wodzu
{
[DllImport("cdn_api.dll", CharSet=CharSet.Ansi)]
// [SecurityPermission(SecurityAction.Assert, Unrestricted = true)]
public static extern int XLLogin([In, Out] XLLoginInfo _lLoginInfo, ref int _lSesjaID);
}
[Serializable, StructLayout(LayoutKind.Sequential)]
public class XLLoginInfo
{
public int Wersja;
public int UtworzWlasnaSesje;
public int Winieta;
public int TrybWsadowy;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x29)]
public string ProgramID;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x15)]
public string Baza;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 9)]
public string OpeIdent;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 9)]
public string OpeHaslo;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 200)]
public string PlikLog;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x65)]
public string SerwerKlucza;
public XLLoginInfo()
{
}
}
}
这就是我调用DLL函数的方式:
int ErrorID = 0; int SessionID = 0;
XLLoginInfo Login;
Login = new XLLoginInfo();
Login.Wersja = 18;
Login.UtworzWlasnaSesje = 1;
Login.Winieta = -1;
Login.TrybWsadowy = 1;
Login.ProgramID = "TestProgram";
Login.Baza = "TestBase";
Login.OpeIdent = "TestUser";
Login.OpeHaslo = "TestPassword";
Login.PlikLog = "C:\\LogFile.txt";
Login.SerwerKlucza = "MyServ\\MyInstance";
ErrorID = cdn_api_wodzu.cdn_api_wodzu.XLLogin(Login, ref SessionID);
当我评论所有字符串字段分配时,该函数有效 - 它返回一条错误消息,表明尚未给出程序ID。但是当我尝试分配一个ProgramID(或任何其他字符串字段,或一次性)时,我得到了上述异常。
我正在使用VS2008 SP.1,WinXP和IIS 5.1。也许国际空间站本身就是一个问题?
我已尝试过这里描述的所有变通办法:
http://forums.asp.net/t/675515.aspx
Thansk你的时间。
编辑后:安装Windows 2003 Server和IIS 6.0解决了这个问题。
答案 0 :(得分:1)
我在编译时专门针对X86平台解决了这个问题。我不知道为什么会这样,但是在我拉了两个小时后我就不在乎了。
答案 1 :(得分:0)
这是您的非托管代码中抛出的异常。如果该代码完全黑盒子,那么您可能希望就此正在使用的DLL的特定版本中的问题与供应商/社区联系。这可能是dll中的一个错误。
如果偶尔发生此错误,您可能希望捕获异常并重试该呼叫。