Привет всем!
Не подскажете, как предпринять такие вот первые шаги по интеропу.
Я хочу иметь .NET сборку (написанную на C++\CLI ), которая предоставляла
пользователям следующую функциональность:
// export_test.h
#pragma once
using namespace System;
namespace ExportTest {
public interface class ICallable
{
void f();
};
public ref class CallImp : ICallable
{
public : virtual void f()
{
Console::WriteLine( "ImpFace.IFace::f()" );
}
};
}
Понятно, что функционал данных классов смогут использовать
любые клиенты совместимые с .NET (С++\CLI, C# и т.п.)
Вопрос как реализовать
совместимость с клиентами native C++, для
следующей формы использования данной .NET сборки
#include "stdafx.h"
#include "export.h"
using namespace std;
using namespace ExportTest;
int _tmain(int argc, _TCHAR* argv[])
{
ExportTest::CREATECALL createCall;
HINSTANCE h = ::LoadLibrary(_T("export_test.dll"));
createCall = (CREATECALL)GetProcAddress( h, ("createCall") );
if ( f != NULL )
{
/*
ICallableFace *iface = createCall();
if ( iface )
iface->f();
//*/
}
return 0;
}
Для этих целей хотелось бы реализовать создание фабрики классов
при помощи экспортируемой для C++ функции по создание объектов,
реализующих ICallable
#include "stdafx.h"
#include "export.h"
#include "export_test.h"
namespace ExportTest{
ICallableFace* createCall()
{
// код, который надо портировать в native C++
// в этом фрагменте не понятно каким средствами разместить
// объект в CLI куче, и осуществить его маршалинг в native C++
// ICallable^ face = gcnew( CallImp() );
// return reinterpret_cast<ICallableFace*>(face);
return 0;
}
}
И последнее — содержание *.h файла для native C++ клиента создаем
// export.h
namespace ExportTest{
class ICallableFace
{
public : virtual void f() = 0;
};
extern "C" _declspec(dllexport) ICallableFace* createCall();
typedef ICallableFace* (*CREATECALL)();
}
Всем заранее большое спасибо