Услуги Сертификаты Новости Статьи База знаний Алгоритмы Портфолио Скачать Ссылки Поиск
Услуги arrow Новости arrow Как создать COM в C#
Как создать COM в C# Версия для печати Отправить на e-mail
14.12.2009

Рассмотрим как создать COM-объект из C# в среде .NET

Решение

1. Определить интерфейс для класса, описать методы, которые будут реализованы в нашем классе. Создать GUID-ды утилитой guidgen.exe, которая находится по умолчанию в папке "C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\guidgen.exe".

[Guid("01D10028-A89D-47ee-8048-C27B6DD4BE63")]
public interface IMyClass
{
    [DispId(1)]
    void HelloWorld(string mymessage);
}

2. Определить интерфейс для COM событий.

// Events
[Guid("5FAC6B03-6D95-46ed-A3C1-B0DBEE34D022"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IMyEvents
{
}

3. Описать класс, с реализующий интерфейсы.

/// <summary>
/// Мой класс
/// </summary>
[Guid("349988BC-2594-46cf-BE83-1F09C25617F3"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(IMyEvents))]
public class MyClass : IMyClass
{
    /// <summary>
    /// Конструктор
    /// </summary>
    public MyClass()
    {

    }
    /// <summary>
    /// Привет!
    /// </summary>
    public void HelloWorld(string mymessage)
    {
        MessageBox.Show((mymessage.Equals(String.Empty) ? "Привет!" : "Привет " + mymessage), "Тест библиотека", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
}

4. Включить в свойствах проекта опцию Make Assembly COM-Visible. Это же относится ко всем библиотекам, которые будет использовать к наш COM-адаптер.

Можно пометить сборку как COM-импортируемую: на закладке свойств проекта включить в разделе Build флаг Register for COM interop. Это позволит вам регистрировать сборку сразу в реестре в момент компиляции. Хотя, у меня возникали проблемы с этой опцией. Я регистрировал библиотеку адаптера с помощью regasm.exe.

5. Подписать сборку уникальными именем (StrongName). На закладке свойств проекта: Properties - Signing - Sign the Assembly - далее, нужно указать имя файла ключа. Пароль указывать не обязательно. Будет автоматически создан файл *.snk, в данном случае, было указано имя TesLib1.snk

6. В файле AssemblyInfo.cs нужно указать параметр, содержащий имя файла подписи:

[assembly: AssemblyKeyFile("TesLib1.snk")]

Этот пункт желателен, но не обязателен.

7. Откомпилировать нашу сборку и получим библиотеку *.dll готовую для регистрации в системе как COM-объект.

8. Зарегистрировать в системе библиотеку с помощью утилиты regasm.exe, которая находится по умолчанию в папке "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe". Для регистрации нужно в консоли выполнить команду:

RegAsm.exe TestLib1.dll

9. Опубликовать библиотеку COM-адаптера и всех библиотек сборки, на которые ссылается в своей работе адаптер, в GAC.

Внимание!

При повторной сборке библиотеки COM-адаптера, предварительно нужно удалить из GAC сопутствующие библиотеки адаптера. Если этого не сделать, в папке BIN\Release (Debug) появится только сама библиотека адаптера. 

В завершение, можно проверить работу нашего COM-объекта с помощью простого HTA-приложения, которое находится в папке bin доступного для загрузки примера.

Я хочу выразить благодарность Shripad Kulkarni, по мотивам статьи которого я написал эту заметку.

Последнее обновление ( 31.03.2010 )
 
< Пред.   След. >