Если вы хотите портировать этот код на .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
для них.
Если вы хотите использовать это как родной объект C#, вам нужно создать обертки 'public ref class'. В этом случае вы можете просто создать библиотеку как «нормальную», а затем создать отдельный слой интерфейса в C++/CLI. – crashmstr
В этом случае оберточный контроллер прост. Но как насчет IEvent? –