在c#中继承原生c++,并将继承类向后传递给c++
本文关键字:c++ 继承 原生 | 更新日期: 2023-09-27 18:13:32
我在本地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修改是多少?
Thanks to lot
这很棘手:
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