2009-10-23 9 views
0

외부 DLL을 호출해야하는 테스트 WCF 서비스 만 만들었습니다. Visutal Studio 개발 서버에서 모든 것이 잘 작동합니다. 나는 IIS 내 서비스를 사용하려고하면 그러나, 나는이 오류가 무엇입니까 :IIS의 WCF에서 DLL을 호출 할 때 System.AccessViolationException이 발생했습니다.

Exception: System.AccessViolationException

Message: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

스택 추적 리즈를 아래에 제시되는 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의 래퍼 모습입니다 내가 함수가 작동하는 모든 문자열 필드 assigments을 언급 할 때

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을 사용하고 있습니다. 어쩌면 ISS 자체가 문제일까요? 당신의 시간을

http://forums.asp.net/t/675515.aspx

Thansk :

나는 여기에 설명 된 모든 해결 방법을 시도했습니다.

편집 후 : Windows 2003 Server 및 IIS 6.0을 설치하면 문제가 해결되었습니다.

답변

1

컴파일 할 때 특별히 X86 플랫폼을 대상으로이 문제를 해결했습니다. 나는 이것이 왜 효과가 있었는지 모르지만 2 시간 후에 나는 내 머리카락을 꺼냈다.

+0

감사합니다. 게리. 나는 이미 그것을 시도하고 도움이되지 않았다. 그것은 제가 제공 한 링크에서 제안되었습니다. – Wodzu

+0

정말 고맙습니다. 저는 완전히 다른 컨텍스트 ('System.ServiceModel')에서'AccessViolation'을 가졌지 만 'x86'대신에 'AnyCPU'를 타겟팅하면 저를 떠나 버렸습니다. 확실히 나를 구원했다! –

0

이것은 관리되지 않는 코드에서 발생하는 예외입니다. 이 코드가 완전히 블랙 박스로되어 있다면이 특정 버전의 DLL에서 사용중인 공급 업체/커뮤니티에 문의하십시오. 정말 dll에 버그가있을 수 있습니다.

이 오류가 간혹 발생하는 경우 예외를 포착하고 통화를 다시 시도 할 수 있습니다.

+0

그것은 항상 일어났습니다. IIS 6.0을 설치하면 문제가 해결되었습니다. – Wodzu

관련 문제