C ++ / CLI конвертирует существующее приложение в управляемый код - PullRequest
4 голосов
/ 20 декабря 2010

У меня есть существующее приложение, написанное на Borland C ++ Builder. Мой клиент хочет переписать его в C # / WPF. Это требует много работы и является сложной задачей, потому что мне нужно переписать весь (огромный) алгоритм. Я думал о способе повторного использования кода и возможности создания только графического интерфейса в C # / WPF. Это возможно? Это будет легко? Как сделать классы C ++ видимыми для .NET?

Если бы вы могли дать мне краткие ответы с некоторыми ссылками / примерами, я был бы благодарен.

Ответы [ 2 ]

4 голосов
/ 20 декабря 2010

Вы можете обернуть свой старый код C ++ в оболочку C ++ / CLI и встроить его в файл DLL.Затем он должен быть виден в любом проекте .NET.

В зависимости от вашего алгоритма / структуры функций, это может немного измениться, но основная форма и способ, которым я это сделал, следующие.Имейте в виду, что это ОЧЕНЬ простой пример, но я попытался включить ключевые моменты:

1.Определите оболочку CLI

using namespace System;

#include "myAlgorithmClass"

public ref class MyCLIWrapperClass //the 'ref' keyword specifies that this is a managed class
{
public:

    MyCLIWrapperClass(); //Constructor

    //function definitions are the same, though some types,
    //like string, change a little. Here's an example:
    String ^ GetAString(); //the "String" is the .NET "System.String" and the ^ is sort of a pointer for managed classes

    //int, double, long, char, etc do not need to be specified as managed.
    //.NET code will know how to handle these types.

    //Here you want to define some functions in the wrapper that will call
    //the functions from your un-managed class. Here are some examples:
    //Say that your functions in the Algorithm class are int Func1, double Func2, and std::string Func3:
    int Func1();
    double Func2();
    String ^ Func3();

private:
    //All private functions and members here
    myAlgorithmClass algor;
};

2.Реализуйте класс-оболочку

using namespace System;
#include <string> //For the string function ex. below
#include "myAlgorithmClass"

MyCLIWrapperClass::MyCLIWrapperClass()
{
    algor = myAlgorithmClass(); //create instance of your un-managed class
}

int MyCLIWrapperClass::Func1()
{
    return algor.Func1(); //Call the un-managed class function.
}

double MyCLIWrapperClass::Func2()
{
    return algor.Func2(); //Call the un-managed class function.
}

String ^ MyCLIWrapperClass::Func3()
{
    //Converting a std::string to a System.String requires some conversion
    //but I'm sure you can find that somewhere on Google or here on SO

    String ^ myString = "";
    std::string myUnmanagedString = algor.Func3(); //Call the un-managed class function.

    //Convert myUnmanagedString from std::string to System.String here

    return myString;
}

После того, как вы напишите класс-оболочку и скомпилируете его в библиотеку классов, вы можете создать ссылку на файл .DLL в проекте C #, и C # должен увидеть управляемый класс-оболочку и все его открытые функции.

Еще одна вещь, на которую следует обратить внимание: если вы создаете новые управляемые объекты в C ++, вы используете ключевое слово «gcnew» вместо «new».Таким образом, новая строка будет String ^ someString = gcnew String();

Наконец, вот несколько ссылок на некоторые вещи о CLI, которые могут помочь:

CLI - Wikipedia CLI - Код проекта CLI - FunctionX

0 голосов
/ 20 декабря 2010

Ну, насколько я помню по голове, вы можете использовать взаимодействия в этом отношении. На самом деле лучше продолжать использовать код, который долгое время тестировался и был стабильным. С Net Interop Services вы можете создать очень хороший мост между новым приложением и старым.

Примеры:
http://www.daniweb.com/forums/thread136041.html
http://msdn.microsoft.com/en-us/library/aa645736%28v=vs.71%29.aspx
http://www.codeguru.com/cpp/cpp/cpp_managed/interop/article.php/c6867

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...