2013-05-14 114 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