9

I currently have a .NET class library written in C# that exposes its functionaility via COM to a C++ program (pre-.NET).

We now want to move the library out-of-process to free up address space in the main application (it is an image-processing application, and large images eat up address space). I remember from my VB6 days that one could create an "OLE automation server". The OS would automatically start and stop the server .exe as objects were created/destroyed. This looks like the perfect fit for us: as far as I can see nothing would change in the client except it would call CoCreateInstance with CLSCTX_LOCAL_SERVER instead of CLSCTX_INPROC_SERVER.

How would I create such an out-of-process server in C#? Either there is no information online about it, or my terminology is off/out of date!

Grokys
  • 16,228
  • 14
  • 69
  • 101
  • I came to the conclusion at one point that this wasn't supported, but I haven't seen that explicitly stated anywhere. I've tried interopping to CoRegisterClassObject to register a factory for a C# COM object, but I never got it to work. Curious if anybody else has had any luck! – Kim Gräsman Nov 18 '09 at 20:30
  • Check out my answer here: http://stackoverflow.com/questions/24724784/com-interop-with-ipc-in-c-sharp/24732010#24732010 – Simon Mourier Jul 17 '14 at 14:21

3 Answers3

6

You can actually do this in .NET (I've done it before as a proof-of-concept), but it's a bit of work to get everything working right (process lifetime, registration, etc).

Create a new Windows application. In the Main method, call RegistrationServices.RegisterTypeForComClients- this is a managed wrapper around CoRegisterClassObject that takes care of the class factory for you. Pass it the Type of the managed ComVisible class (the one you actually want to create- .NET supplies the class factory automatically) along with RegistrationClassContext.LocalServer and RegistrationConnectionType.SingleUse. Now you have a very basic exe that can be registered as a LocalServer32 for COM activation. You'll still have to work out the lifetime of the process (implement refcounts on the managed objects with constructors/finalizers- when you hit zero, call UnregisterTypeForComClients and exit)- you can't let Main exit until all your objects are dead.

The registration isn't too bad: create a ComRegisterFunction attributed method that adds a LocalServer32 key under HKLM\CLSID(yourclsidhere), whose default value is the path to your exe. Run regasm yourexe.exe /codebase /tlb, and you're good to go.

nitzmahone
  • 13,720
  • 2
  • 36
  • 39
  • Thank you: turns out that lifetime management wasn't an issue: we just start the out-of-process server when the main app starts and shut it down when it finishes. So the only trick was to call RegistrationServices.RegisterTypeForComClients - easy! – Grokys Nov 20 '09 at 15:47
2

You could always expose your .NET class as COM classes using InteropServices and then configure the library as a COM+ application. The .NET library would run out-of-process and be hosted by a DLLHOST.EXE instance.

Tim Lowes
  • 357
  • 3
  • 4
1

Here is an article in MSDN that covers all aspects of how to create COM localserver in c# (.net): link

Nedko
  • 69
  • 3