2012-04-26 2 views
1

IIS6 용으로 작성된 ISAPI 필터가 있습니다. 이제 IIS7 필터를 래핑하기 위해 IIS7 용 래퍼를 작성해야합니다. C#에서 HTTP 모듈을 작성하고 관리되지 않는 dll 메소드를 Pinvoke 할 계획입니다. 나는 다음과 같은 코드의 C#을 표현을 필요ISAPI 관련 메서드 및 구조를 C#으로 변환하는 방법

,

DWORD WINAPI HttpFilterProc(
    PHTTP_FILTER_CONTEXT pfc, 
    DWORD notificationType, 
    LPVOID pvNotification 
); 

    typedef struct _HTTP_FILTER_CONTEXT HTTP_FILTER_CONTEXT { 
     DWORD cbSize; 
     DWORD Revision; 
     PVOID ServerContext; 
     DWORD ulReserved; 
     BOOL fIsSecurePort; 
     PVOID pFilterContext; 
     BOOL GetServerVariable; 
     BOOL AddResponseHeaders; 
     BOOL WriteClient; 
     VOID * AllocMem; 
     BOOL ServerSupportFunction; 
    } HTTP_FILTER_CONTEXT, * PHTTP_FILTER_CONTEXT; 

내가는 CodePlex에서 PInvoke를 Assistant를 사용하여 시도하지만 난 그것이 작동되도록 할 수 없습니다입니다. 이전에 이런 일을 한 사람이 있습니까? 누구나 위의 해결 방법을 제공 할 수 있습니까?

보정 : 네이티브 코드 컨텍스트 struct에 대한 포인터를 전달

[DllImport(@"XyzISAPI.dll")] 
public static extern uint HttpFilterProc(
    ref HttpFilterContext pfc, 
    uint notificationType, 
    IntPtr pvNotification 
); 

에 의해 구조체를 전달 : 올바른 구조는 다음과 같은 사용해야 답변의 코드에

답변

0

건물을 추가 ref을 사용하면 쉽게 일치시킬 수 있습니다. 마지막 매개 변수는 LPVOID이며 void*이며 관리 코드에는 일반 IntPtr입니다.

[StructLayout(LayoutKind.Sequential)] 
public struct HttpFilterAccessDenied 
{ 
    IntPtr URL; 
    IntPtr PhysicalPath; 
    uint Reason; 
} 

당신은 다음과 같이 그 중 하나 얻을 수 있습니다 :

HTTP_FILTER_ACCESS_DENIED에 관해서는, 이런 식으로 정의

HttpFilterAccessDenied hfad = (HttpFilterAccessDenied)Marshal.PtrToStructure(
    pvNotification, typeof(HttpFilterAccessDenied)); 

을 그리고 당신은 struct에서 문자열 값의 보류를 얻을 수 있습니다 Marshal.PtrToStringUni 또는 Marshal.PtrToStringAnsi입니다.

+0

감사합니다. 이로 인해 디버깅시 PInvokeStackImbalance 예외가 해결되었습니다. 하지만 여전히 pvNotification이 0으로 반환되었습니다. 다른 세부 정보를 확인한 다음 여기에서 업데이트합니다. – GorillaCoder

+0

귀하의 답변에 투표 할 수 없습니다. – GorillaCoder

+0

''IntPtr.Zero'는'pvNotification' 매개 변수에 전달할 것이 아무것도 없을 때 전달됩니다. 당신은 투표에 대한 충분한 명성이 없지만 받아 들일 수 있습니다. –