2013-12-05 4 views
0

У меня есть эта простая библиотека, написанная на C++ (исходный код включен)портировании C++ библиотека для .NET

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, но после многих google я ничего не нашел.

Кто-нибудь знает, как перенести этот код в C++/CLI? Я могу построить всю библиотеку в C++/CLI, но библиотека не экспортирует никаких символов.

Редактировать 1 Библиотека огромна, и переписать на другом языке слишком дорого.

+1

Если вы хотите использовать это как родной объект C#, вам нужно создать обертки 'public ref class'. В этом случае вы можете просто создать библиотеку как «нормальную», а затем создать отдельный слой интерфейса в C++/CLI. – crashmstr

+0

В этом случае оберточный контроллер прост. Но как насчет IEvent? –

ответ

2

Если вы хотите портировать этот код на .NET, который будет использоваться на других языках .NET, таких как C#, то вы захотите переделать работу этой библиотеки. Независимо от того, какой язык вы решите реализовать в, если ваша цель должна использоваться другими языками .NET, вы должны переключиться на .NET-парадигмы.

Например: в настоящее время у вас есть абстрактный класс с именем IEvent. Вы можете создать интерфейс .NET с именем IEvent и реализовать его таким же образом, но это не так, как вы делаете это в .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 можно выполнить с помощью Заданий и перегрузки переменных состояния), но некоторые из них только C# (например, одна сборка работает в 32-битном и 64-битном режимах).

Что касается вашей попытки скомпилировать библиотеку как есть в C++/CLI, вам необходимо пометить классы как управляемые классы. Измените классы на public ref class, а перечисления - на public enum class, и они создадут их как управляемые. Следующим шагом будет переход всех ваших указателей на ваши собственные классы из неуправляемых указателей (*) в управляемые ссылки (^) и использовать gcnew вместо new для них.

Смежные вопросы