从 C# 应用程序调用 C++ 代码或移植它?

Posted

技术标签:

【中文标题】从 C# 应用程序调用 C++ 代码或移植它?【英文标题】:Call C++ code from a C# application or port it? 【发布时间】:2010-10-24 17:46:09 【问题描述】:

我最近一直在与 an algorithm 搏斗,它在 C# 中的实现很糟糕(即开发人员被拖到另一个项目并且未能充分记录他所做的事情)。

我找到了一个替代方案(来自数字配方),它可以工作,但用 C++ 编写。所以我想可能最安全的方法是将 C++ 包装在一个 DLL 中。

请记住,当谈到 C# 时,我仍然有点不成熟,并且从未尝试过从头开始制作 DLL,这听起来是不是一个合理的方法(如果是这样,有没有人尝试过这个/得到任何建议) ?还是我应该全力以赴,尝试将 C++ 例程移植到 C# 中?

编辑 - 我不是在寻找任何人为我做出决定,但如果有人对这两种路线有任何经验,我很想听听他们的意见和任何令人讨厌的陷阱避免。例如,将数据列表从 C# 传递到 C++ STL 向量有多讨厌?

【问题讨论】:

那一天,C 委员会决定从 C++ 复制 STL。他们宁愿采用 Java 泛型 :D。 NR 绝对是 C,但根据印刷品的不同,您可能正在处理 FORTRANisms,例如从 1 开始计数。 好地方.. 看起来这个版本的数字配方是用 C++ 编写的 :-) 【参考方案1】:

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

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

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

【讨论】:

...我也不希望你也这样:-) 我问这个问题是为了尝试评估其他人对这两种选择的体验。也许我应该改写一下。 删除了关于做出决定的行。【参考方案2】:

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

【讨论】:

我见过那个版本,但它似乎是一个明显不同的实现(输入/输出与我的参考模型大不相同)......这很可能是我对代码的解释。 我已经有了 - 该实现看起来与我的参考差异太大,无法进行合理比较(即验证我的代码是否有效会更难)。这不是一个糟糕的答案,只是与我正在寻找的解决方案不太相关。 @Jon Cage :该实现似乎在不少应用程序中使用。【参考方案3】:

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

【讨论】:

这听起来令人鼓舞。你有任何链接可以帮助我了解这个吗? O'Reilly 有一本书听起来可能会有所帮助 (ondotnet.com/pub/a/dotnet/2004/03/29/mcpp_part3.html) 恐怕我没有任何链接——你发现的那个链接本身看起来很不错,当然你可以在 *** 上询问是否需要解决任何特定的绊脚石【参考方案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();

    

【讨论】:

非常好 - 我会试一试。

以上是关于从 C# 应用程序调用 C++ 代码或移植它?的主要内容,如果未能解决你的问题,请参考以下文章

从本机 C++ 调用 C#,而不使用 /clr 或 COM?

与 C++ 结构等效(或更好)的 C# 结构

将 C# 桌面应用程序移植到 Web

C++ 库问题

从 C# .NET 应用程序调用 C/C++ 代码

如何使用 C# 从 C++ 应用程序获取调用堆栈?