如何将ISAPI相关的方法和结构转换为C#

时间:2012-04-26 19:07:55

标签: pinvoke dllimport signature isapi

我有一个为IIS6编写的ISAPI过滤器。我现在需要为IIS7编写一个包装器来包装IIS6过滤器。我计划在C#中编写HTTP模块,并在Pinvoke中编写非托管的dll方法。

我需要以下代码的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,但我无法使其工作。 以前有人做过这样的事吗? 任何人都可以提供上述解决方案吗?

更正:添加了正确的结构

1 个答案:

答案 0 :(得分:0)

根据答案中的代码,您需要使用以下内容:

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

本机代码传递指向上下文struct的指针,并通过ref传递结构是匹配它的简单方法。最终参数为LPVOID,其为void*,在托管代码中为普通IntPtr

至于HTTP_FILTER_ACCESS_DENIED,请按以下方式定义:

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

然后您可以获得以下其中一个:

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

然后,您可以使用structMarshal.PtrToStringUni来获取Marshal.PtrToStringAnsi中的字符串值。