将C ++库移植到.NET

时间:2013-12-05 14:46:01

标签: c++ .net c++11 c++-cli shared-libraries

我有这个用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 图书馆很大,用其他语言重写太贵了。

1 个答案:

答案 0 :(得分:2)

如果要将此代码移植到.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他们。