Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How To Expose a DIctionary<> to COM Interop

I have an Interface that is defined something along these lines:

Interface foo
  {
  int someProperty {get; set;}
  Dictionary<string, object> Items;
  }

The concrete class that implements this interface needs to be registered for COM Interop. Everything compiles and the assemblies seem to register OK, but then when trying to create the COM object (e.g. from PowerShell) I get an error.

This seems to be related to the generic Dictionary<> class that I'm using. So here is the question:

  1. Is it even possible to expose generic collections through COM Interop?
  2. If yes, then how is it done?
  3. If no, then what's the workaround?
like image 614
Tim Long Avatar asked Aug 18 '09 20:08

Tim Long


2 Answers

I ended up here via a Google search and, ha ha, I should have guessed this would come from you.

As far as I know generics can't be marshalled through COM with the standard marshallers. What I do know is that an ArrayList in C# turns into a "standard" collection in COM, usable by VBScript, VB, JScript 5.x, etc. But since we're working toward a common goal, I'm going to play with some other aggregate types and see what happens.

like image 69
Bob Denny Avatar answered Oct 20 '22 00:10

Bob Denny


Generics can't be COM-visible, VS should give you a compile-time warning about this.

Another solution could be to make the dictionary private and expose methods to add/remove/fetch items to/from the dictionary:

public interface ComVisibleFoo
{
    int SomeProperty { get; set; }

    //Dictionary<string, object> Items; // can't be COM-visible

    void AddItem(string key, object value);
    void RemoveItem(string key);
    object Item(string key);
}
like image 2
Mathieu Guindon Avatar answered Oct 20 '22 01:10

Mathieu Guindon