BCB Вызов из С++Builder DLL библиотек .NET (Через COM)

1. Создаем DLL библотеку .NET доступную как COM
1.1. Создаем проект Windows Class Library
1.2. Создаем публичный интерфейс, через который будем вызывать функции C#

using System.Runtime.InteropServices;

using System;

[Guid("540F3FD1-5709-4d48-86E3-321537955DA7")]
public interface ITestUI
{
int ShowTestForm(IntPtr hwnd);
int GetVersion();
}

1.3. В Guid прописываем то, что выдаст Tools-Create GUID
1.4. Создаем Класс который будет  реализовывать задуманные функции

[Guid("A701E920-798B-463d-8BFC-079EC2174634")]
public class TestUI : ITestUI
{
public int GetVersion()
{
return 1;
}

public int ShowTestForm(IntPtr hwnd)
{
TestForm frm = new TestForm();
return (int)frm.ShowDialog(new WindowWrapper(hwnd));
}
}

1.5. Заполняем Guid для использования в COM
1.6.  WindowWrapper  - класс обертка позволяет передавать в .NET DLL HWND в виде long
1.7.  В свойствах проекта ставим галочку Application - Assembly information - Make COM Visible

1.8. VS 2008-2010 Ставим галочку Register for COM interop

1.9. Собираем проект.

2. Создаем клиентский проект BCB
2.1. Создаем проект Windows Application
2.2. Добавляем библиотеку типов в проект TestUI.tlb  C++ Builder 6 сам создаст необходимые обертки на с++
2.3. В форме добавлем свойство класса ITestUIPtr exUI;

//form1.h
#include "TestUI_TLB.h"
class TForm1 : public TForm
{
...
public:        // User declarations
__fastcall TForm1(TComponent* Owner);
ITestUIPtr extUI;
};

2.4. Добавляем вызовы функций из .NET библиотеки в том месте где они нам нужны
//form1.cpp
....
long ver = extUI->GetVersion();
...
hwnd = (long)Handle; //передаем окно родителя
long result =  cpi->ShowTestForm(hwnd);

2.5. В Инициализации приложения в WinMain создаем объект класса

#include "form1.h"
#include "TestUI_TLB.h"
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
CoInitialize(NULL);

ITestUIPtr ui = CoTestUI::Create(); //Конструктор появиться для public

Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Form1->extUI = ui;
Application->Run();
cpi->Release();
}catch(...)
...
CoUninitialize();
return 0;
}

PS Для любителей Borland C++ Builder, имеющих большое количество кода предложенная схема позволяет постепенно переводить приложения на .NET. При этом начинать можно как с внутренней логики так и с пользовательского интерфейса.

Комментарии

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <p> <br><b><i>
  • Строки и параграфы переносятся автоматически.

Подробнее о форматировании

КАПЧА
Этот тест необходим защиты от спама
9 + 9 =
Решите эту простую математическую задачу и введите результат. То есть для 1+3, введите 4.