从C#应用程序调用C++代码还是将其移植?

5

我最近在处理一个算法(链接),但它的实现很糟糕(即开发者被调到了另一个项目上,并未充分记录他所做的事情),用的是C#。

我找到了一个来自数值计算图书的替代方法,但是它是用C++编写的。所以我想,最安全的方法可能是将C++封装在DLL中。

考虑到我在C#方面还有些不熟练,从未尝试过从头开始制作DLL,这是否听起来像是一个合理的方法(如果是,有人尝试过这样做/有任何建议吗?)?还是应该全力以赴将C++例程移植到C#中?

编辑 - 我不是要别人替我做决定,但如果有人对任一路线有经验,我会很乐意听取他们的意见和避免任何不良后果的建议。例如,从C#传递数据列表到C++ STL向量有多么棘手?


那将是个好日子,当C委员会决定从C++复制STL。他们宁愿采用Java泛型:D。NR绝对是C,但根据打印输出,你可能会遇到FORTRAN的习惯,例如从1开始计数。 - MSalters
不错,看起来这个数值计算法版本是用C++写的 :-) - Jon Cage
4个回答

3
我尝试使用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();

    }
}

2
如果Mitch提到的C#版本不适合您的目的,您可以使用托管的C++包装器,它可以重用和包装您拥有的C代码,但仍然可见于您的托管应用程序作为本地的.Net程序集。我过去曾经使用过这种方法来使用一个没有自己的本地.Net API的库的C API,并发现在两者之间传输数据相对轻松。

那听起来很鼓舞人心。你有什么链接可以帮助我进入这个领域吗?O'Reilly出版了一本书,看起来可能会有所帮助(http://www.ondotnet.com/pub/a/dotnet/2004/03/29/mcpp_part3.html)。 - Jon Cage
很抱歉,我没有任何链接——你找到的那个链接本身看起来很不错,当然如果你需要解决任何具体的障碍,你可以在StackOverflow上提问。 - Rowland Shaw

1

这取决于你的目标是什么。

如果你的目标是拥有一个可用的应用程序,我会权衡两种方法的成本和收益,并选择最具成本效益的方法。

如果你的目标是提高你的C#编程水平,那么请重新编写C代码。


我也不指望你会 :-) 我提出这个问题是为了尝试了解其他人对这两个选项的经验。也许我应该重新措辞一下。 - Jon Cage
已删除有关做出决策的行。 - ChrisF

0

或者你可以从这里下载已经实现的C#代码。


我看过那个版本,但它似乎是一个显著不同的实现(输入/输出与我的参考模型大相径庭)...虽然这可能是我对代码的解释。 - Jon Cage
我已经有了 - 那个实现看起来与我的参考实现差别太大,无法进行合理的比较(即验证我的代码是否有效会更加困难)。这不是一个坏答案,只是对我正在寻找的解决方案不太相关。 - Jon Cage
@Jon Cage:这个实现似乎在很多应用程序中被使用。 - Mitch Wheat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接