COM senza registrazione e file Manifest

C'è un piccolo gioiello in Visual Studio C++ 2005 ed è il Manifest tool (mt). Qualcuno avrà letto degli articoli come Registration-Free Activation of COM Components: A Walkthrough che spiegano che da Windows XP è possibile utilizzare una componente COM "privata" alla mia applicazione senza bisogno di registrarla.

Per questo si devono compilare dei file manifest che contengano le informazioni normalmente scritte da una componente nel registry al momento della propria registrazione. Questi file son semplici concettualmente (banali per chi ha mai dovuto ripulirsi il registry a mano) ma è improponibile riempirli a mano per una componente che abbia più di una manciata di classi e di interfacce.

Visual Studio C++ 2005 ha una simpatica opzione per creare in automatico il file manifest durante la build del progetto di una componente COM, tra le proprietà del progetto, sotto Configuration Properties / Manifest tool / Isolated COM e questo va bene se ho i sorgenti della componente COM.

Quello che non ho trovato facilmente nella documentazione o nei forum è la risposta alla domanda: se ho una componente COM già realizzata, come faccio a generare il manifest?

Se ne ho la TLB (tipicamente è inclusa nelle risorse della DLL) bastano tre parametri ad MT, ad esempio:

 mt -tlb:SomeCom.dll -dll:SomeCom.dll -out:SomeCom.X.manifest

Il manifest così prodotto manca solo di un passo, aggiungere come l'elemento assemblyIdentity, come in questo esempio.

 <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">


  <assemblyIdentity
    type="win32"
    name="SomeCom.X"
    version="1.0.0.0" />

  <file name = "SideBySide.dll">
    <!-- contenuto generato da MT -->
  </file>

  <comInterfaceExternalProxyStub >
    <!-- contenuto generato da MT -->
  </comInterfaceExternalProxyStub>

</assembly>

Adesso per usare le classi contenute nella componente COM dovremo solo creare un manifest per il programma chiamante, qualcosa del tipo:

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity type="win32" 
                    name="myOrganization.myDivision.myApp" 
                    version="1.0.0.0" 
  />
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" 
                    name="SomeCom.X" 
                    version="1.0.0.0" 
      />
    </dependentAssembly>
  </dependency>
</assembly>

A questo punto potete cominciare a dimenticarvi di regsvr32.