2010-03-27 9 views
5

Ich habe einen Windows-Dienst in .Net geschrieben und möchte die Klassen offenlegen, die von anderem .Net-Code aufgerufen werden sollen. Insbesondere habe ich eine API, die ich über eine DLL offen legen möchte, die im GAC platziert wird, und ich möchte, dass die DLL im GAC die Klassen des .Net Windows-Dienstes verwendet. Ich brauche diese Architektur, da der Code im Windows-Dienst als anderer Benutzer/Account als der Aufrufer der API ausgeführt werden muss (das Konto wird zur Installationszeit erstellt).Einen .Net-Dienst aussetzen

Mein Plan war es, die Windows-Dienstklassen über COM verfügbar zu machen (regasm.exe zu registrieren und tlbexp.exe, um die Typbibliothek zu erstellen) und dann die Klassen in der GAC-DLL über COM aufzurufen (importiert über tlbimp.exe) . Allerdings bekomme ich folgende Fehler von tlbimp:

TlbImp: error TI0000: System.Runtime.InteropServices.COMException - Typ Bibliothek ‚‘ wurde aus einer CLR-Assembly exportiert und können nicht wieder- als CLR-Assembly importiert werden.

Das bedeutet für mich, dass meine Methode nicht einfach funktionieren wird. Ich kann nur denken, dass ich eine C++ - DLL als eine Brücke für meine GAC-DLL benötigen könnte, um die COM-Aufrufe aufzurufen, aber das scheint eine schlimme Lösung zu sein.

Ich bin im Grunde auf der Suche nach Vorschlägen. Kann jemand Klassen eines Windows-Diensts, der in .Net geschrieben wird, mit anderem .Net-Code offen legen?

Antwort

0

bei Verwendung würde ich alle Windows-Dienst-Logik in einem separaten DLL stellen (egxdll). Definieren Sie eine Schnittstelle für Ihre Klassen in x.dll. Fügen Sie in dem Windows-Dienst und dem anderen .Net-Projekt dem Projekt von x.dll Referenz hinzu. Auf diese Weise können Sie Wiederverwendbarkeit erreichen.

Verwandte Themen