Defining the Marshaling Type
Before you can build a marshaler, you must define the managed and unmanaged interfaces being marshaled. These interfaces commonly perform the same function, but are exposed differently to managed and unmanaged objects.
A managed compiler produces a managed interface from metadata, and the resulting interface looks like any other managed interface. The following code example shows a typical interface:
#using <mscorlib.dll>
interface INew {
void NewMethod();
}
You define the unmanaged type in Interface Definition Language (IDL) and compile it with the MIDL compiler. You define the interface within a library statement and assign it an interface ID with the universal unique identifier (UUID) attribute.
In Old.idl
[uuid(9B2BAADA-0705-11D3-A0CD-00C04FA35826)]
library OldLib {
[uuid(9B2BAADD-0705-11D3-A0CD-00C04FA35826)]
interface IOld : IUnknown
HRESULT OldMethod();
}
The MIDL compiler produces several output files. If the interface is defined in Old.idl, the output file Old_i.c defines a const variable with the interface identifier (IID) of the interface:
In Old_i.c
const IID IID_IOld = {0x9B2BAADD,0x0705,0x11D3,{0xA0,0xCD,0x00,0xC0,0x4F,0xA3,0x58,0x26}};
The Old.h file is also produced by MIDL. It contains a C++ definition of the interface that can be #included into your C++ source code.
See Also
Concepts
Implementing the ICustomMarshaler Interface
Using a Substitute Marshaler