Я создал только тестовый сервис 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 решила проблему.