[英]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個事件。 而不是addListener
和removeListener
,每個事件都有添加和刪除方法(通過+=
和-=
訪問)。
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.