System.AccessViolationException при вызове DLL из WCF на IIS - PullRequest
0 голосов
/ 23 октября 2009

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

Ответы [ 2 ]

1 голос
/ 23 октября 2009

Я решил эту проблему, специально настроившись на платформу X86 при компиляции. Я не знаю, почему это сработало, но после 2 часов выдергивания волос мне было все равно.

0 голосов
/ 24 октября 2009

Это исключение в вашем неуправляемом коде. Если этот код полностью помещен в черный ящик, вы можете обратиться к поставщику / сообществу по поводу проблемы в этой конкретной версии используемой вами DLL. Это действительно может быть ошибка в DLL.

Если эта ошибка иногда возникает, вы можете перехватить исключение и повторить вызов.

...