2014-07-14 13 views
6

Per poter utilizzare COM .dll in C++ tutto quello che serve in fase di compilazione è quello di #import TLB (o DLL che estrae il TLB) e sono pronto ad andare. Perché C# richiede che la DLL sia registrata (COM reg-free è la stessa registrata) per compilare? Perché il TLB non è abbastanza?Perché C# ha bisogno di registrare DLL COM per fare riferimento ad esso?

Avviso mia domanda riguarda la compilazione del .dll utilizzando l'oggetto COM. Capisco perché l'oggetto deve essere registrato durante il runtime.

+0

Non sono sicuro che qualsiasi vecchia applicazione C++ possa eseguire una DLL COM senza registrazione; sembra essere l'antitesi della stessa COM. Forse quell'applicazione utilizza direttamente la funzionalità fornita da quella DLL, senza passare attraverso l'intermediario del server COM. – antiduh

+0

avviso @antiduh Chiedo solo informazioni sulla compilazione, non in esecuzione. – TCS

+0

Da .NET, puoi fare riferimento al TLB, perché dici che deve essere registrato? –

risposta

3

Prima di tutto, a differenza di un compilatore C++ oi molti altri compilatori in grado di leggere le librerie dei tipi, né il CLR né compilatori .NET effettivamente letto una libreria di tipi. Entrambi dipendono da una libreria di interoperabilità , un assembly .NET generato da una libreria di tipi. Contiene solo dichiarazioni, decompilate dal tlb, in un formato comprensibile sia al CLR che ai compilatori.

Lo strumento principale che fa questo è Tlbimp.exe, l'importatore libreria dei tipi.

esecuzione Tlbimp.exe non è un requisito difficile, anche se ci si pensa di fare questo su un server di build. L'IDE supporta anche la navigazione delle librerie dei tipi registrati dalla finestra di dialogo Aggiungi riferimento. L'elemento che viene aggiunto al progetto contiene la chiave del Registro di sistema, non il nome della libreria dei tipi. L'attività MSBuild <ResolveComReference> genera l'assembly di interoperabilità dalle informazioni di registro.

Il principale vantaggio di questa operazione è che ora è facile per l'auto-generare le voci manifesto in modo che il server COM può essere utilizzato senza essere registrati. Aka "COM reg-free". Le informazioni del registro sono richieste per fornire le voci manifest. Attivato semplicemente impostando la proprietà Isolated su True per il riferimento. Molto desiderabile.

+0

Prima di tutto, grazie mille per la risposta dettagliata, ma se ho capito bene, dovrebbe essere possibile generare assembly di interoperabilità su una macchina che la DLL COM è registrata e quindi sul server di build dovrei essere in grado solo di fare riferimento al Interop e tutto dovrebbe funzionare, ho capito bene? – TCS

+0

L'ho provato e la compilazione fallisce, voglio sapere se fallisce perché mi manca qualcos'altro, o ho completamente sbagliato tutto ... – TCS

+0

Hai fatto una domanda XY. Ho risposto a Y, non ho idea di come sia X. Fai un'altra domanda e spiega il tuo problema, documentalo bene. –