Заворачиваем C#-класс в COM



Пусть у нас имеется C#-класс, который делает что-нибудь полезное, например:

public class Calculator
{
    public int Sum(int a, int b)
    {
        return a + b;
    }
}

Давайте создадим для этого класса COM-интерфейс, чтобы его функциональность можно было использовать в других местах. В конце посмотрим на использование этого класса в среде Delphi.

Для начала нужно пойти в свойства проекта и на вкладке Build поставить галочку напротив Register for COM interop:

Далее создаём интерфейс для нашего класса:

public interface ICalculator
{
    int Sum(int a, int b);
}

public class Calculator : ICalculator
{
    public int Sum(int a, int b)
    {
        return a + b;
    }
}

Класс и интерфейс нужно пометить рядом атрибутов: следует указать для них уникальные GUID-ы, указать ComVisible(true) , а для класса также добавить атрибут ClassInterface(ClassInterfaceType.None):

[Guid("364C5E66-4412-48E3-8BD8-7B2BF09E8922")]
[ComVisible(true)]
public interface ICalculator
{
    int Sum(int a, int b);
}

[Guid("8C034F6A-1D3F-4DB8-BC99-B73873D8C297")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class Calculator : ICalculator
{
    public int Sum(int a, int b)
    {
        return a + b;
    }
}

Уже почти всё готово! Можно собирать готовый вариант нашей сборки. Благодаря галочке Register for COM interop COM-компнент сам зарегистрируется в системе, но регистрацию можно провести и руками. Делается это с помощью утилиты RegAsm, которую можно найти в "C:\Windows\Microsoft.NET\Framework\v<номер нужной версии>". С помощью аргумента /tlb можно попутно создать сопутствующий tlb-файл. Отменить регистрацию сборки поможет атрибут /u. Итак, выполним команду (будем считать, что название проекта и соответствующей dll — ComCalculator):

RegAsm.exe Calculator.dll /tlb

Отлично, теперь наш компонент зарегистрирован! Давайте откроем Delphi и попробуем его использовать. После создания нового проекта (пусть это будет обычный WinForms-проект) нужно импортировать в него ComCalculator. Выбираем из меню Project пункт Import Type Library . В списке находим ComCalculator и жмём Install:

В файле Unit1.pas необходимо добавить ComCalculator_TLB в раздел uses. После этого у вас могут быть проблемы с компиляцией mscorlib_TBL.pas. Если это так, то просто удалите ссылку на него из раздела uses файла ComCalculator_TLB.pas.

Теперь попробуем использовать наш COM-компонент. Будем это делать прямо в конструкторе формы. Тело конструктора будет содержать две незамысловатые строчки: в первой мы создадим экземпляр класса TCalculator , а во второй вызовем метод Sum , результат вычислений покажем с помощью процедуры ShowMessage.

procedure TForm1.FormCreate(Sender: TObject);
var
  calculator : TCalculator;
begin
  calculator := TCalculator.Create(Self);
  ShowMessage(IntToStr(calculator.Sum(1, 2)));
end;

Запустив приложение, вы сможете увидеть появившееся окошечко с цифрой 3 и порадоваться.

Ссылки

Для более сложных вариантов создания COM-объектов рекомендуются к изучению следующие статьи:

Поделиться:
Исходный код поста находится на GitHub:
https://github.com/AndreyAkinshin/aakinshin.net/blob/master/ru/_posts/dotnet/wrap-cs-in-com.md