从本机C+继承+;在C#中,并将继承类向后传递给C++; 我在一个本地C++ DLL中有一个引擎,我需要在C项目中使用它。
我是个新手,但我已经在谷歌上搜索了几个小时,现在我或多或少知道如何实现它。我知道我必须编写一个C#或C++/CLI包装类 <>但是我还没有找到如何包装DLL C++类的一些方面。 发动机具有以下重要部件的百分之一级:从本机C+继承+;在C#中,并将继承类向后传递给C++; 我在一个本地C++ DLL中有一个引擎,我需要在C项目中使用它。,c#,c++,dll,interop,c++-cli,C#,C++,Dll,Interop,C++ Cli,我是个新手,但我已经在谷歌上搜索了几个小时,现在我或多或少知道如何实现它。我知道我必须编写一个C#或C++/CLI包装类 但是我还没有找到如何包装DLL C++类的一些方面。 发动机具有以下重要部件的百分之一级: class CEntity { void SendMsg(CEntity *receiver); virtual void ReceiveMsg(MSG msg); } 其工作原理如下: 来自CEntity的inherit类重写了ReceiveMsg函数,
class CEntity
{
void SendMsg(CEntity *receiver);
virtual void ReceiveMsg(MSG msg);
}
其工作原理如下:
来自CEntity的inherit类重写了ReceiveMsg函数,该函数实现了它所做的事情,并且继承了与发送消息通信的对象
我需要在C语言中使用这个功能:从CEntity继承,以C++代码调用它的方式重写RealvEMsg,并能够向其他C“继承”CcIt实体对象发送消息,抛出SDEMSMG C++实现。
或者换句话说,我需要C++非托管代码调用一个C托管代码。C++代码调用了接收程序(),我需要“重写”它,或者重定向到C代码中。p>
是一种不改变dll的方法吗?我不能直接访问C++代码,但如果需要,我可以请求修改DLL。如果没有,最小的dll修改是什么
非常感谢这很棘手:
伊洛格
#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 );
}
};
}
#pragma一次
#包括“CMSysString.h”
#包括“CLRILogger.h”
#包括
使用名称空间系统;
类CNtvLogger;
名称空间AlPDFGenV4
{
公共参考类记录器
{
公众:
记录器(无效);
虚拟记录器(void);
ILogger^extlogger;
CNtvLogger*ntv;
无效日志(字符串^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;
}
};
#包括“StdAfx.h”
#包括“LRLog.h”
使用名称空间AlPDFGenV4;
记录器::记录器(无效)
{
ntv=新的CNtvLogger;
ntv->clrlogger=此;
}
记录器::~记录器(无效)
{
删除ntv;
}
类CNtvLogger:CMSysLogger
{
公众:
gcroot-clr记录器;
受保护的:
void\u内部日志(LPCTSTR txt)
{
字符串^str=gcnew字符串(txt);
clrlogger->Log(str);
}
公众:
bool Init(void*obj)
{
返回true;
}
};
希望这有帮助
在本例中,类记录器是一个桥接器,它允许保持本机记录器(由本机代码使用)和接口ILogger(由托管代码用于传递接收日志输出的类)之间的链接
你需要在C++中使用这样的类,不需要用这种方法来改变DLL。< /P>你必须创建一个C类,并使用它的C++ DLL实例的函数……M.sisiKiRisk,问题是我需要C++非托管代码调用一个C托管代码。C++代码正在调用接收程序(),我需要“重写”它,或者重定向到C代码。抱歉,但是我有困难试图理解你的解决方案。我对C++/CLI和互操作非常熟悉。你能试着更深入地解释一下吗?我不懂怎么用包装纸。在CNtvLogger:CMSysLogger中,什么是CMSysLogger类?很抱歉,我已经很长时间没有连接了,所以我没有看到您的问题。我想现在太晚了。请接受我的道歉。