2013-05-14 49 views
1

我有一个本机C++ DLL中的引擎,我需要在C#项目中使用它。从C#中的本地C++继承,并将继承类向后传递给C++

我完全是这样做的新手,但我一直在Google上搜索几个小时,现在我知道或多或少的如何实现它。我知道我必须编写一个C#或C++/CLI包装类。

但我还没有找到如何包装dll C++类的某些方面。 发动机具有类CEntity蒙山这一重要环节:

class CEntity 
{ 
    void SendMsg(CEntity *receiver); 
    virtual void ReceiveMsg(MSG msg); 
} 

那工作原理如下: 从CEntity一个继承类覆盖了ReceiveMsg函数执行它所whants,并继承对象comunicate发送消息。

我需要的是在C#中使用此功能:从CEntity“传承”,在这样的C++代码可以调用它覆盖ReceiveMsg,并能发送消息给其他C#“传承” CEntity OBJETS扔SendMsg C++实现。 换句话说,我需要C++非托管代码调用C#托管代码。 C++代码调用ReceiveMessage(),我需要“覆盖”它或将该调用重定向到C#代码。

是否这样做的方式没有改变DLL?我无法直接访问C++代码,但如果需要,我可以要求修改dll。如果不是,最小的dll修改是什么?

非常感谢

+0

您必须创建一个c#类并使用其中的C++ dll实例的函数... – mtsiakiris 2013-05-14 10:44:20

+0

@mtsiakiris问题是我需要C++非托管代码调用C#托管代码。 C++代码调用ReceiveMessage(),我需要“覆盖”它或将该调用重定向到C#代码。 – Aragorn 2013-05-14 12:39:17

回答

1

这是棘手:

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; 
    } 

}; 

希望这有助于。

在这个例子中,类记录器是一个桥THA允许保持天然记录器(由本机代码中使用)及接口ILogger之间的链路(使用托管代码来传递接收日志输出的类别) 。

你需要在你的C++/CLI中需要这样的类,不需要用这种方法改变dll。

+0

对不起,但我在尝试了解您的解决方案时遇到问题。我真的是C++/CLI和Interop的新手。你可以尝试更深入地解释它吗?我不明白如何使用包装。在CNtvLogger中:CMSysLogger什么是CMSysLogger类? – Aragorn 2013-05-14 18:20:53

+0

很抱歉,我没有连接很长时间,所以我没有看到你的问题。我想现在已经太晚了。请接受我的道歉。 – 2015-02-05 10:14:40