繁体   English   中英

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

[英]System.AccessViolationException when calling DLL from WCF on IIS

我只创建了一个测试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

谢谢你的时间。

编辑后:安装Windows 2003 Server和IIS 6.0解决了该问题。

我通过在编译时专门针对X86平台解决了这一问题。 我不知道为什么这样做,但是在拉出我的头发2个小时后,我不在乎。

这是在非托管代码中引发的异常。 如果该代码对您来说完全是黑盒,那么您可能需要与所使用的DLL特定版本中的问题有关的供应商/社区联系。 它实际上可能是dll中的错误。

如果偶尔发生此错误,则您可能想捕获异常并重试该调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM