2014-07-14 9 views
6

Um COM .dll in C++ zu verwenden, brauche ich nur in der Kompilierzeit #import der TLB (oder DLL, die den TLB extrahiert) und ich bin bereit zu gehen. Warum benötigt C# die Registrierung der DLL (reg-free COM ist gleich wie registriert), um kompilieren zu können? Warum ist der TLB nicht genug?Warum muss C# COM DLL registrieren, um es zu referenzieren?

Beachten Sie meine Frage betrifft die Kompilierung der .dll mit dem COM-Objekt. Ich verstehe, warum das Objekt zur Laufzeit registriert werden muss.

+0

Ich bin nicht sicher, dass jede alte C++ - Anwendung eine COM-DLL ohne Registrierung ausführen kann; das scheint die Antithese von COM selbst zu sein. Vielleicht verwendet diese Anwendung die von dieser DLL bereitgestellte Funktionalität direkt, ohne den COM-Server-Vermittler zu durchlaufen. – antiduh

+0

@antiduh Hinweis Ich frage nur über Kompilieren, nicht ausgeführt. – TCS

+0

Von .NET können Sie auf den TLB verweisen, warum soll er registriert werden? –

Antwort

3

Zunächst einmal, im Gegensatz zu einem C++ - Compiler oder den vielen anderen Compilern, die Typbibliotheken lesen können, lesen weder die CLR noch .NET Compiler tatsächlich eine Typbibliothek. Sie hängen beide von einer Interop-Bibliothek ab, einer .NET-Assembly, die aus einer Typbibliothek generiert wird. Es enthält nur deklarierte Deklarationen aus der TLB in einem Format, das sowohl die CLR als auch die Compiler verstehen können.

Das primäre Tool, das dies tut, ist Tlbimp.exe, der Typbibliothekimporteur.

Das Ausführen von Tlbimp.exe ist keine schwierige Anforderung, obwohl Sie dies auf einem Buildserver in Betracht ziehen würden. Die IDE unterstützt auch das Durchsuchen registrierter Typbibliotheken im Dialogfeld Verweis hinzufügen. Das Element, das dem Projekt hinzugefügt wird, enthält den Registrierungsschlüssel und nicht den Typ Bibliotheksname. Die MSBuild-Task <ResolveComReference> generiert die Interop-Assembly aus den Registrierungsinformationen.

Der Hauptvorteil dabei ist, dass es jetzt einfach ist, die Manifesteinträge automatisch zu generieren, damit der COM-Server ohne Registrierung verwendet werden kann. Auch bekannt als "reg-free COM". Die Registrierungsinformationen werden benötigt, um die Manifest-Einträge bereitzustellen. Wird einfach aktiviert, indem Sie die isolierte Eigenschaft für die Referenz auf True setzen. Sehr wünschenswert.

+0

Zunächst einmal vielen Dank für die detaillierte Antwort, aber wenn ich richtig verstehe, sollte es möglich sein, Interop Assembly auf einem Rechner zu generieren, dass die COM DLL registriert ist und dann auf dem Build Server nur auf den Interop und alles sollte funktionieren, habe ich es richtig gemacht? – TCS

+0

Ich habe es versucht und die Kompilierung schlägt fehl, ich möchte wissen, ob es fehlschlägt, weil ich etwas anderes vermisse, oder ich habe die ganze Sache völlig falsch ... – TCS

+0

Sie fragte eine XY-Frage. Ich antwortete Y, ich habe keine Ahnung, wie X aussieht. Stellen Sie eine andere Frage und erklären Sie Ihr Problem, dokumentieren Sie es gut. –