1

我有一个为 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,但我无法使其工作。有没有人做过这样的事情?任何人都可以提供上述解决方案吗?

更正:添加了正确的结构

4

1 回答 1

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));

然后您可以从structwithMarshal.PtrToStringUni或中获取字符串值Marshal.PtrToStringAnsi

于 2012-04-27T12:52:52.243 回答