我在原生C ++ dll中有一个引擎,我需要在C#项目中使用它。
我是新手,但我一直在谷歌搜索几个小时,现在我或多或少知道如何实现它。我知道我要写一个C#或C ++ / CLI包装器类。
但我还没有找到如何包装dll C ++类的某些方面。 该引擎具有CEntity级别,这是其中的重要部分:
class CEntity
{
void SendMsg(CEntity *receiver);
virtual void ReceiveMsg(MSG msg);
}
其工作原理如下: 来自CEntity的继承类会覆盖实现其所需内容的ReceiveMsg函数,并且继承对象可以发送消息。
我需要在C#中使用此功能:从CEntity“继承”,以C ++代码可以调用它的方式覆盖ReceiveMsg,并且能够将消息发送到其他C#“继承”CEntity对象抛出SendMsg C ++实现。 或者换句话说,我需要C ++非托管代码调用C#托管代码。 C ++代码调用ReceiveMessage(),我需要“覆盖”它或将该调用重定向到C#代码。
这是一种不用改变dll的方法吗?我无法直接访问C ++代码,但如果需要,我可以要求进行dll修改。如果没有,那么最小的dll修改是什么?
非常感谢
答案 0 :(得分:2)
这很棘手:
ILogger.h
#pragma once
using namespace System;
namespace AlPDFGenV4
{
public interface class ILogger
{
public:
virtual void Log( String^ ltxt ) = 0;
};
}
然后LRLog.h
#pragma once
#include "CMSysString.h"
#include "CLRILogger.h"
#include <vcclr.h>
using namespace System;
class CNtvLogger;
namespace AlPDFGenV4
{
public ref class Logger
{
public:
Logger(void);
virtual ~Logger(void);
ILogger^ extlogger;
CNtvLogger *ntv;
void Log( String^ txt )
{
extlogger->Log( txt );
}
};
}
和LRLog.cpp
#include "StdAfx.h"
#include "LRLog.h"
using namespace AlPDFGenV4;
Logger::Logger(void)
{
ntv = new CNtvLogger;
ntv->clrlogger = this;
}
Logger::~Logger(void)
{
delete ntv;
}
class CNtvLogger : CMSysLogger
{
public:
gcroot<AlPDFGenV4::Logger ^> clrlogger;
protected:
void _InternalLog( LPCTSTR txt)
{
String ^str = gcnew String( txt );
clrlogger->Log( str );
}
public:
bool Init(void * obj)
{
return true;
}
};
希望这有帮助。
在此示例中,类Logger是一个桥接器,允许保持本机记录器(由本机代码使用)和接口ILogger(托管代码用于传递接收日志输出的类)之间的链接。
你需要在C ++ / CLI中使用这样的类,不需要用这种方法改变dll。