[MarshalAs(UnmanagedType.LPStruct)] public Guid pIID;
[MarshalAs(UnmanagedType.Interface)] public object pItf;
public int hr;
User-Defined Field Types:
Marshal.SizeOf() refuses to deal the pIID member as it is specified, perhaps because it cannot manage the pointer.
Change public Guid pIID to IntPtr and marshal your guid directly to an allocated memory block and this struct will work with CoCreateInstanceEx.
An IntPtr is a pointer to a memory location (unmanaged) that adapts to the platform it is running on (64-bit, etc.) UNLIKE a standard int/Integer. You should always use this type for unmanaged calls that require it, even though an int will appear to work on your development machine.