我有这个用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 图书馆很大,用其他语言重写太贵了。
答案 0 :(得分:2)
如果要将此代码移植到.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
他们。