簡體   English   中英

將C ++庫移植到.NET

[英]porting C++ library to .NET

我有這個用C ++編寫的簡單庫(包括源代碼)

struct MyStruct
{
    char message[ 90 ];
    int t;
};

enum MyEnum
{
    MY_ENUM_1, MY_ENUM_2
};

class IEvent 
{
public:
    virtual ~IEvent() {}

    virtual void event1( time_t ) = 0;
    virtual void event2( MyStruct s ) = 0;
    virtual void event3( MyEnum e ) = 0;
};

class Impl;

class MY_API Controller
{
public:
    Controller( IEvent* eventListener );
    ~Controller();

    void addListener( IEvent* eventListener );
    void removeListener( IEvent* eventListener );

    void f1( MyEnum e );
    void f2();

private:
    Impl* mImpl;
};

代碼在C ++ 11中實現。 我需要將此代碼移植到.NET。

我認為一個很好的選擇可以是C ++ / CLI,但經過很多谷歌我沒有發現任何東西。

有人知道如何在C ++ / CLI中移植此代碼嗎? 我能夠在C ++ / CLI中構建所有庫,但庫不會導出任何符號。

Edit1圖書館很大,用其他語言重寫太貴了。

如果要將此代碼移植到.NET,以便在其他.NET語言(如C#)中使用,那么您將需要重新處理此庫的工作方式。 無論您選擇使用哪種語言 ,如果您的目標是被其他.NET語言使用,您應該切換到.NET范例。

例如:目前,您有一個名為IEvent的抽象類。 您可以創建一個名為IEvent的.NET接口,並以相同的方式實現它,但這不是您在.NET中的工作方式。 相反,您需要定義3個委托類型,並讓Controller類定義這些委托類型的3個事件。 而不是addListenerremoveListener ,每個事件都有添加和刪除方法(通過+=-=訪問)。

delegate void Event1Handler(object sender, DateTime data);
delegate void Event2Handler(object sender, MyStruct data);
delegate void Event3Handler(object sender, MyEnum data);

public class EventExample_Controller
{
    public event Event1Handler Event1;
    public event Event2Handler Event2;
    public event Event3Handler Event3;
}

至於使用的語言,我的初始響應是“C#,如果可以,C ++ / CLI,如果你必須”。 你還沒有說過這個庫的功能,在C#中執行它可能並不容易,甚至可能。 但是如果你能用C#做,那么你將獲得語言提供的好處:許多好處在C ++ / CLI中具有等價物(例如,linq查詢語法可以用常規語法表示,擴展方法可以被稱為常規靜態方法,使用async關鍵字的所有內容都可以使用Tasks和一堆狀態變量完成),但有些只是C#(例如,有一個程序集在32位和64位模式下工作)。

至於您嘗試在C ++ / CLI中按原樣編譯庫,您需要將類標記為托管類。 將類更改為public ref class ,將枚舉更改為public enum class ,並將它們創建為托管類。 下一步是將所有指針從非托管指針( * )切換到托管引用( ^ ),並使用gcnew而不是new

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM