I’ve noticed that if I make a .NET component that exposes an ArrayList, then that ArrayList passes through COM Interop and is available in scripted languages such as VBScript.
Generics, such as IList<T> do not seem to work.
Why is this and is there any way to make a generic type successfully flow through COM Interop to a scripting engine?
Generics were added in .NET 2.0 and COM existed before .NET 1.0.
(And was the technology .NET aimed to replace.)
COM never had generics, and therefore you cannot expose them.
Neither of COM languages (C++, VB6, Delphi) had generics so you can’t expect them to be consumed.
(Well, C++ had templates but they are completely a different beast, and COM only meant interfaces.)
Exposing collections as an
ArrayListis the solution to this problem, you can’t work around it.COM never “had”
ArrayLists, true, but so it never had any of the classes in .NET Framework, because it is not a framework itself. However, some of the .NET types get into the exported type libraries, and some don’t. What about .NET Framework classes? Well,ArrayListis[ComVisible], andList<T>isn’t.Why?
COM works via interfaces, and the Interface Definition Language has no clue about generics and doesn’t support them. Languages that support COM, such as VB6 or C++, wouldn’t know what to do with the generics.
If there was a way to generate an interface for
List<T>, it would not containTin it so there is essentially no point in trying to expose a generic type. Possible imaginary alternatives to this would be:IListOfStringforList<string>Twithobject.The first option is not viable because the concrete
Ttype may not be known at compilation (read: Reflection), andList<T>doesn’t have a[ComVisible]attribute on it anyway.The second option is actually sort of possible because you can provide your own class interface with
IListandICollectionproperties:This is a workaround and doesn’t answer your question though.
I am actually wondering if you could derive your
StringListclass fromList<string>and mark it as[ComVisible(true)]. You may want to check that.