Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从本机C+继承+;在C#中,并将继承类向后传递给C++; 我在一个本地C++ DLL中有一个引擎,我需要在C项目中使用它。_C#_C++_Dll_Interop_C++ Cli - Fatal编程技术网

从本机C+继承+;在C#中,并将继承类向后传递给C++; 我在一个本地C++ 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函数,

我是个新手,但我已经在谷歌上搜索了几个小时,现在我或多或少知道如何实现它。我知道我必须编写一个C#或C++/CLI包装类

<>但是我还没有找到如何包装DLL C++类的一些方面。 发动机具有以下重要部件的百分之一级:

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类?很抱歉,我已经很长时间没有连接了,所以我没有看到您的问题。我想现在太晚了。请接受我的道歉。