从IIS上的WCF调用DLL时出现System.AccessViolationException

时间:2009-10-23 11:45:48

标签: c# wcf iis dll

我只创建了一个测试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解决了这个问题。

2 个答案:

答案 0 :(得分:1)

我在编译时专门针对X86平台解决了这个问题。我不知道为什么会这样,但是在我拉了两个小时后我就不在乎了。

答案 1 :(得分:0)

这是您的非托管代码中抛出的异常。如果该代码完全黑盒子,那么您可能希望就此正在使用的DLL的特定版本中的问题与供应商/社区联系。这可能是dll中的一个错误。

如果偶尔发生此错误,您可能希望捕获异常并重试该呼叫。