Для моего проекта было обновлено код 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-взаимодействием, но, по моему опыту, вы можете просто добавить ссылку на COM-DLL в свой проект, и он автоматически запускает tlbimp.exe, который создает сборку COM-взаимодействия (управляемая сборка, которая имеет завершаемые во время обертки для всех классов COM).
Проверьте эту страницу: http://msdn.microsoft.com/en-us/library/697w37zd.aspx
Я использовал этот подход в нескольких проектах.