我有一个为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,但我无法使其工作。 以前有人做过这样的事吗? 任何人都可以提供上述解决方案吗?
更正:添加了正确的结构
答案 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));
然后,您可以使用struct
或Marshal.PtrToStringUni
来获取Marshal.PtrToStringAnsi
中的字符串值。