Definizione del tipo di marshalling
Prima di compilare un gestore di marshalling è necessario stabilire su quali interfacce gestita e non gestita dovrà agire. Tali interfacce svolgono solitamente la stessa funzione, ma sono esposte in modo diverso, l'una a oggetti gestiti, l'altra a oggetti non gestiti.
Un compilatore gestito utilizza metadati per produrre un'interfaccia gestita. L'interfaccia risultante appare come qualsiasi altra interfaccia gestita. Nell'esempio di codice che segue viene illustrata un'interfaccia tipica.
#using <mscorlib.dll>
interface INew {
void NewMethod();
}
Il tipo non gestito viene definito con il linguaggio di definizione dell'interfaccia (IDL, Interface Definition Language) e compilato con il compilatore MIDL. All'interfaccia, definita all'interno di un'istruzione di libreria, viene assegnato un ID di interfaccia con l'attributo UUID (Universal Unique Identifier).
In Old.idl
[uuid(9B2BAADA-0705-11D3-A0CD-00C04FA35826)]
library OldLib {
[uuid(9B2BAADD-0705-11D3-A0CD-00C04FA35826)]
interface IOld : IUnknown
HRESULT OldMethod();
}
Il compilatore MIDL produce diversi file di output. Se l'interfaccia è definita in Old.idl, nel file di output Old_i.c verrà definita una variabile const con l'IID (Interface Identifier) dell'interfaccia:
In Old_i.c
const IID IID_IOld = {0x9B2BAADD,0x0705,0x11D3,{0xA0,0xCD,0x00,0xC0,0x4F,0xA3,0x58,0x26}};
Anche il file Old.h viene prodotto da MIDL. Esso contiene una definizione C++ dell'interfaccia che può essere inclusa (con #include) nel proprio codice sorgente C++.