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. При этом начинать можно как с внутренней логики так и с пользовательского интерфейса.
Комментарии
Отправить комментарий