Блог переехал. Актуальная версия поста находится по адресу: http://aakinshin.net/ru/blog/dotnet/wrap-cs-in-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-объектов рекомендуются к изучению следующие статьи:
Комментариев нет:
Отправить комментарий