Showing posts with label Example. Show all posts
Showing posts with label Example. Show all posts
Monday, May 7, 2012
COM interop an interesting link
Here you can find an interesting link about COM interop
http://limbioliong.wordpress.com/2011/10/28/exposing-an-enumerator-from-managed-code-to-com/
This is one of his most important tips
The interface type should be either :
ComInterfaceType.InterfaceIsDual
or ComInterfaceType.InterfaceIsIDispatch
otherwise the GetEnumerator() method
will not be marked with dispid -4.
Without this dispid, this method
will not be recognized by COM as
returning an enumerator. It will not thus
not be usable in a VB6.0 For Each Next
statement.
Example of a COM Class Collection Written in C#
This is an example of a COM Class Collection written in C#.
You can use as starting point my template or use the Tools - Create Guid Tool on VS 2008.
You need to start a new project of type library, and set the project property Build -> Register for COM Interop
Do not check: Application, Assembly Information, Make Class COM Visible.
We are using the COMVisible attribute to decide which class is visible for us
The class will have both a defaul property (the indexers) and an iterator
You can use as starting point my template or use the Tools - Create Guid Tool on VS 2008.
You need to start a new project of type library, and set the project property Build -> Register for COM Interop
Do not check: Application, Assembly Information, Make Class COM Visible.
We are using the COMVisible attribute to decide which class is visible for us
The class will have both a defaul property (the indexers) and an iterator
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; using System.Collections; namespace TestEmployeesCol { //Wee first define the interface of the Collection [Guid("21C027E8-CF8C-4166-A63B-25D8E790F040"), InterfaceType(ComInterfaceType.InterfaceIsDual), ComVisible(true)] public interface INewEmployees : System.Collections.IEnumerable { [DispId(-4)] new IEnumerator GetEnumerator(); //Iterator [DispId(1)] void Add(object key, object value); [DispId(2)] object Count { get; } [DispId(3)] void Remove(object key); [DispId(0)] object this[object key] { get; set; } } //We define the event interface [Guid("5C6B8153-D2D6-4e98-80EF-D13A53CC9CDD"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch), ComVisible(true)] public interface INewEmployeesEvents { } //<ComClass(NewEmployees.ClassId, NewEmployees.InterfaceId, NewEmployees.EventsId)> _ [Guid("1692DD4D-6F3E-4e77-AB50-5401F04306DC"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(INewEmployeesEvents)), ComDefaultInterface(typeof(INewEmployees)), ComVisible(true)] public class NewEmployees : INewEmployees { #region "COM GUIDs" // These GUIDs provide the COM identity for this class // and its COM interfaces. If you change them, existing // clients will no longer be able to access the class. public const string ClassId = "1692DD4D-6F3E-4e77-AB50-5401F04306DC"; public const string InterfaceId = "21C027E8-CF8C-4166-A63B-25D8E790F040"; #endregion public const string EventsId = "5C6B8153-D2D6-4e98-80EF-D13A53CC9CDD"; // A creatable COM class must have a Public Sub New() // with no parameters, otherwise, the class will not be // registered in the COM registry and cannot be created // via CreateObject. SortedList _SortedList; public NewEmployees() : base() { _SortedList = new SortedList(); } public object this[object key] { get { return _SortedList[key]; } set { _SortedList[key] = value; } } public object Count { get { return _SortedList.Count; } } public void Remove(object key) { _SortedList.Remove(key); } public void Add(object key, object value) { _SortedList.Add(key, value); } public System.Collections.IEnumerator GetEnumerator() { ICollection keys = _SortedList.Keys; return (IEnumerator)keys.GetEnumerator(); } } }
Subscribe to:
Posts (Atom)