Tim Long
Tim Long

Reputation: 13778

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?

Upvotes: 5

Views: 2513

Answers (2)

Mathieu Guindon
Mathieu Guindon

Reputation: 71177

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);
}

Upvotes: 3

Bob Denny
Bob Denny

Reputation: 1303

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.

Upvotes: 6

Related Questions