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(); } } }
No comments:
Post a Comment