2009-11-18 11 views
9

Ich habe derzeit eine in C# geschriebene .NET-Klassenbibliothek, die ihre Funktionalität über COM einem C++ - Programm (pre.NET) zugänglich macht.Erstellen eines COM-Automatisierungsservers in C#

Wir möchten nun die Bibliothek aus dem Prozess verschieben, um den Adressraum in der Hauptanwendung freizugeben (es ist eine Bildverarbeitungsanwendung, und große Bilder verbrauchen Adressraum). Ich erinnere mich an meine VB6 Tage, dass man einen "OLE Automation Server" erstellen konnte. Das Betriebssystem würde den Server .exe automatisch starten und stoppen, wenn Objekte erstellt/zerstört wurden. Das sieht für uns ganz nach unserem Geschmack aus: Soweit ich sehen kann, würde sich im Client nichts ändern, außer dass CoCreateInstance mit CLSCTX_LOCAL_SERVER anstelle von CLSCTX_INPROC_SERVER aufgerufen würde.

Wie würde ich einen solchen Out-of-Process-Server in C# erstellen? Entweder gibt es keine Informationen online oder meine Terminologie ist veraltet.

+0

ich zu dem Schluss an einem Punkt kam, dass dies nicht unterstützt wurde, aber ich haven‘ Das habe ich nirgendwo explizit gesehen. Ich habe versucht, CoRegisterClassObject zu interpingen, um eine Factory für ein C# COM-Objekt zu registrieren, aber ich habe es nie zum Laufen gebracht. Neugierig, wenn noch jemand Glück gehabt hat! –

+0

Überprüfen Sie meine Antwort hier: http://stackoverflow.com/questions/24724784/com-interop-with-ipc-in-c-sharp/24732010#24732010 –

Antwort

6

Sie können dies tatsächlich in .NET tun (ich habe es vorher als Proof-of-Concept gemacht), aber es ist ein bisschen Arbeit, alles richtig zu machen (Prozesslebensdauer, Registrierung, etc.).

Erstellen Sie eine neue Windows-Anwendung. Rufen Sie in der Main-Methode RegistrationServices.RegisterTypeForComClients auf. Hierbei handelt es sich um einen verwalteten Wrapper um CoRegisterClassObject, der die Klassenfactory für Sie übernimmt. Übergeben Sie den Typ der verwalteten ComVisible-Klasse (die Sie tatsächlich erstellen möchten - .NET stellt die Klassenfactory automatisch zur Verfügung) zusammen mit RegistrationClassContext.LocalServer und RegistrationConnectionType.SingleUse. Jetzt haben Sie eine sehr einfache exe, die als LocalServer32 für die COM-Aktivierung registriert werden kann. Sie müssen die Lebensdauer des Prozesses noch berechnen (implementieren Sie Refcounts für die verwalteten Objekte mit Konstruktoren/Finalizer, wenn Sie auf Null klicken, UnregisterTypeForComClients aufrufen und beenden). Sie können Main nicht beenden, bis alle Objekte inaktiv sind.

Die Registrierung ist nicht zu schlecht: Erstellen Sie eine ComRegisterFunction attribute-Methode, die einen LocalServer32-Schlüssel unter HKLM \ CLSID (yourclsidhier) hinzufügt, dessen Standardwert der Pfad zu Ihrer Exe ist. Führen Sie regasm yourexe.exe/cobebase/tlb aus, und Sie können loslegen. Hier

+0

Vielen Dank: stellt sich heraus, dass Lifetime-Management kein Problem war : Wir starten den Out-of-Process-Server beim Start der Haupt-App und beenden ihn, wenn er fertig ist. Der einzige Trick war, RegistrationServices.RegisterTypeForComClients aufzurufen - einfach! – Grokys

2

Sie könnten Ihre .NET-Klasse immer als COM-Klassen mit InteropServices verfügbar machen und dann die Bibliothek als COM + -Anwendung konfigurieren. Die .NET-Bibliothek würde außerhalb der Verarbeitung ausgeführt und von einer DLLHOST.EXE-Instanz gehostet.

1

ist ein Artikel in MSDN, die alle Aspekte, wie deckt COM Local in C# (.NET) zu erstellen: link

Verwandte Themen