Предоставить собственный класс C ++ для VB.NET

0

Для моего проекта было обновлено код UI-стороны. Он был преобразован с VB6 на VB.NET. Из-за этого я хотел бы изменить, как код UI-интерфейса взаимодействует с моим кодом на стороне процессора.

В настоящее время код на стороне двигателя является COM-объектом, который создается следующим образом:

_engine = CreateObject("MyEngine")

Я хотел бы изменить это так, чтобы он загружал движок как сборку.NET. Что-то вроде:

Dim asm As Reflection.Assembly = Reflection.Assembly.LoadFrom("MyEngine.dll")
_engine = asm.CreateInstance("TestEngine")

Чтобы достичь этого, я изменил родной C++ класс CEngine для компиляции с /clr. После выполнения некоторых настроек проекта он успешно скомпилировался.

Следующая часть - моя проблема (у меня мало опыта в этом). Мне нужно, чтобы он был "видимым" в.NET. Поэтому, читая онлайн, кажется, что лучшим решением является создание управляемого класса для "обертывания" вокруг моего родного класса.

Вот какой-то код для моей маленькой обертки... ничего сложного:

Wrapper.h

public ref class TestEngine
{
public:
    TestEngine(void);
    virtual ~TestEngine(void);
protected:
    !TestEngine(void);
private:
    CEngine *_engine; // native (COM) c++ object pointer
};

Wrapper.cpp

#include "Wrapper.h"
TestEngine::TestEngine(void)
{
    _engine = new CEngine();
}

TestEngine::~TestEngine(void)
{
    if (_engine)
    {
        delete _engine;
        _engine = NULL;
    }
}

TestEngine::!TestEngine(void)
{
    if (_engine)
    {
        delete _engine;
        _engine = NULL;
    }
}

Таким образом, ошибка здесь заключается в том, что я не могу создать экземпляр CEngine, потому что его методы COM (QueryInterface, AddRef и Release) являются абстрактными. Итак, мой вопрос: должен ли я получить этот класс и создать экземпляр производного класса? Я даже иду по правильному пути здесь? Моя главная цель - избавиться от неуправляемой/управляемой границы между моим кодом интерфейса и кодом двигателя, если это возможно. Таким образом, исключая использование COM внутри, а вместо этого, загружая сборки.NET.

Теги:
com
wrapper

1 ответ

1

У меня относительно небольшой опыт работы с COM-взаимодействием, но, по моему опыту, вы можете просто добавить ссылку на COM-DLL в свой проект, и он автоматически запускает tlbimp.exe, который создает сборку COM-взаимодействия (управляемая сборка, которая имеет завершаемые во время обертки для всех классов COM).

Проверьте эту страницу: http://msdn.microsoft.com/en-us/library/697w37zd.aspx

Я использовал этот подход в нескольких проектах.

  • 0
    Спасибо - на самом деле, я думаю, что проект использует некоторые взаимодействующие библиотеки для взаимодействия с методами движка. Но в любом случае мой босс хочет, чтобы эти dll-модули взаимодействия исчезли и вместо этого загрузили сборки. По-видимому, они приводят к сбою модульных тестов проекта ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню