.NET <--> native C++
От: __Dmitry__ Россия  
Дата: 23.06.08 08:32
Оценка:
Привет всем!

Не подскажете, как предпринять такие вот первые шаги по интеропу.

Я хочу иметь .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)();
}


Всем заранее большое спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.