从C#应用程序或端口调用C ++代码吗?

时间:2009-05-08 08:33:53

标签: c# c++ dll port

我最近一直在与an algorithm进行斗争,但是在C#中实施得很糟糕(即开发人员被拉到另一个项目并且未能充分记录他所做的事情)。

我找到了一种替代方法(来自数字配方),但它是用C ++编写的。所以我认为最安全的方法就是将C ++包装在DLL中。

请记住,在C#方面我仍然有点绿,并且从未尝试过从头开始创建DLL,这听起来像是一种合理的方法(如果有的话,有人试过这个/得到任何建议) ?或者我应该全力以赴并尝试将C ++例程移植到C#中?

编辑 - 我不是在寻找任何人为我做出决定,但如果有人对任何一条路线有任何表现,我都会有兴趣听取他们的意见和任何应该讨论的令人讨厌的陷阱要避免。例如,将C#中的数据列表传递给C ++ STL向量是多么令人讨厌?

4 个答案:

答案 0 :(得分:4)

我尝试从c#代码链接到c-dll,效果非常好,即使我在环境之间发送数据时遇到了一些问题。否则,程序非常简单。您来回发送的数据(数量和频率)越多,程序运行的速度就越慢,但您可能已经自己想出了这个数据。

主要缺点是每次更改或有人发现错误时都要维护c#-c粘合代码(接口代码)。

以下是一些可以帮助您入门的代码:

using System.Runtime.InteropServices;
    class myDllCaller {

       //call to function in the dll returning an int
      [DllImport("MyFavorite.dll")]
      private static extern int dllFunction(//list of parameters to function);

    public static void Main() {
    int rerult = dllFunction();

    }
}

答案 1 :(得分:2)

如果C#版Mitch引用不适合您的目的,您可以使用托管C ++包装器,它可以重用,并包装您拥有的C代码,但仍然可以作为托管应用程序显示原生.Net组装。我过去曾使用过这种方法来使用没有自己的原生.Net API的库的C API,并发现两者之间的编组数据相对无痛。

答案 2 :(得分:1)

这取决于你的目标。

如果要有一个有效的应用程序,我会衡量两种方法的成本和收益,并以最具成本效益的方式进行。

如果要改进你的C#,那么一定要重写C。

答案 3 :(得分:1)

...或者您可以从here下载C#中已经实现的代码。