C ++ / CLI转换现有应用程序执行托管代码

时间:2010-12-20 17:16:06

标签: c# c++-cli

我有一个用Borland C ++ Builder编写的现有应用程序。我的客户希望用C#/ WPF重写它。这需要大量的工作并且是一项复杂的任务,因为我需要重写整个(巨大的)算法。我正在考虑重用代码的方法,并且只能在C#/ WPF中创建GUI。这可能吗?这会容易吗?如何使C ++类对.NET可见?

如果你能给我一些链接/例子的简短回答,我将不胜感激。

2 个答案:

答案 0 :(得分:4)

您可以将旧的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;
}

在编写包装类并将其编译到类库中之后,您可以在C#项目中创建对.DLL文件的引用,C#应该看到托管包装类及其所有公共函数。

另外需要注意的是,如果要在C ++中创建新的托管对象,请使用关键字“gcnew”而不是“new”。因此,新字符串将为String ^ someString = gcnew String();

最后,这里有一些关于CLI的一些内容的链接可能有所帮助:

CLI - Wikipedia
CLI - Code Project
CLI - FunctionX

答案 1 :(得分:0)

嗯,据我记得,你可以使用interops来解决这个问题。 事实上,继续使用经过长时间测试且稳定的代码会更好。使用网络互操作服务,您可以在新应用程序和旧应用程序之间建立一个非常好的桥梁。

例子:
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