.. to fool the compiler (or CLR, or both) is to created additional unmanaged wrapper methods.
For example, I was able to avoid dummy definition of apr_table _t: namespace Apache { namespace Native { extern "C" { struct apr_table_t {}; .... by introducing two umanaged functions in WorkerRequest.cpp like this: static const apr_array_header_t __nogc * InternalAprTableElts(request_rec __nogc* rr, int mode) { return apr_table_elts( mode==1?rr->headers_in:rr->subprocess_env); } static void InternalAprTableSet(request_rec __nogc *rr, const char __nogc * key, const char __nogc * val ) { apr_table_set(rr->headers_out, key, val); } This required moving bodies of SendKnownResponseHeader() and SendUnknownResponseHeader() from header to cpp file. This worked but is clearly less efficient and uglier. The only reason I tried it is because I found CLR thinking that apr_table_t is value type large 1 byte (caused by dummy definition) somewhat scary. I guess that for now we have to rely on the fact that all apr_table_t pointers inside request_rec are marshalled as IntPtr. Tony __________________________________ Do you Yahoo!? Take Yahoo! Mail with you! Get it on your mobile phone. http://mobile.yahoo.com/maildemo