gpt4 book ai didi

c# - 在 C# 中从 native C++ 继承并将继承类向后传递给 C++

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:35 26 4
gpt4 key购买 nike

我在 native 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 objets 抛出 SendMsg C++ 实现。或者换句话说,我需要 C++ 非托管代码调用 C# 托管代码。 C++ 代码正在调用 ReceiveMessage(),我需要“覆盖”它或将该调用重定向到 C# 代码。

有没有一种方法可以在不更改 dll 的情况下做到这一点?我无法直接访问 C++ 代码,但如果需要,我可以要求修改 dll。如果不是,最小的 dll 修改是多少?

非常感谢

最佳答案

这很棘手:

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 是一个桥梁,它允许保持 native 记录器(由 native 代码使用)和接口(interface) ILogger(由托管代码用于传递接收日志输出的类)之间的链接。

您的 C++/CLI 中需要一个这样的类,无需使用这种方法更改 dll。

关于c# - 在 C# 中从 native C++ 继承并将继承类向后传递给 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16540267/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com