[DllImport("ole32.dll")]
static extern int CoInitializeSecurity(IntPtr pVoid, int cAuthSvc,
SOLE_AUTHENTICATION_SERVICE [] asAuthSvc, IntPtr pReserved1,
uint dwAuthnLevel, uint dwImpLevel, IntPtr pAuthList, uint dwCapabilities,
IntPtr pReserved3);
Declare Function CoInitializeSecurity Lib "ole32.dll" (pVoid As IntPtr, _
cAuthSvc As Integer, asAuthSvc() As SOLE_AUTHENTICATION_SERVICE, _
pReserved1 As IntPtr, dwAuthnLevel As Integer, dwImpLevel As Integer, _
pAuthList As IntPtr, dwCapabilities As Integer, pReserved3 As IntPtr) As Integer
You shouldn't call CoInitializeSecurity from managed code. That's because the CLR will almost always call into COM/OLE upon startup before execution enters your main method, and as a side effect COM/OLE will implicitly call CoInitializeSecurity if it hasn't already been called. Therefore, calling this from managed code will usually return RPC_E_TOO_LATE.
The workaround is to write an unmanaged "shim" that will call CoInitializeSecurity, then activate and call into managed code. You can do this via an export from a mixed-mode C++ DLL, by registering a managed component for use by COM, or by using the CLR hosting API.
Do you know one? Please contribute it!