views:

82

answers:

1

I have a C# assembly that I use as an in-proc COM server consumed by an unmanaged C++ application. The assembly consumes a webservice that will not ever change so there's no need to ever update the webservice proxy classes. That's why the proxy classes are create donce and Reference.cs files are simply put into the repository and only compiled from there.

The problem is that by default the webservice proxy classes are public and are therefore exposed to COM. This inflates the typelib and pollutes registry. Changing visibility to internal break the assembly, so those entities need to remain public, but need not be exposed to COM.

The dumb way is to approach every public interface/class in the Reference.cs files and mark it with

[System.Runtime.InteropServices.ComVisible(false)]

After that it is no longer exposed to COM.

Is there a better way?

+2  A: 

You could

  • mark the assembly itself to not to be ComVisible and then explicitly mark all interfaces/classes/enums you want to expose to COM as ComVisible.
  • use a 2nd file and partial class to mark your proxy types to be ComVisible(false)

    [System.Runtime.InteropServices.ComVisible(false)] partial class YourProxyType {}

    [System.Runtime.InteropServices.ComVisible(false)] partial class AnotherProxyType {}

Robert Giesecke
Will you please elaborate on the first option? I have only one assembly, reference.cs files are compiled into it together with my code.
sharptooth
Yes, but you can mark all class with ComVisible(true) that actually make sense to be visible via COM.OTOH, since you said your WSDL proxy is quite static (API-wise), you might be better off with a partial type file that marks all its classes to be ComVisible(false).That way, you could still regenerate it, since you haven't actually touched the auto-generated file.
Robert Giesecke
I got it. It works. I've expanded your answer with elaboration on the first option.
sharptooth