继承C#中的本机C ++并将继承类向后传递给c ++

时间:2013-05-14 10:01:37

标签: c# c++ dll interop c++-cli

我在原生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修改是什么?

非常感谢

1 个答案:

答案 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。