C# 通过P/Invoke包装器或在c中运行进程调用本机代码的性能# 我有一些本地的应用程序,我们已经用C++编写并编译成可执行文件。执行等

C# 通过P/Invoke包装器或在c中运行进程调用本机代码的性能# 我有一些本地的应用程序,我们已经用C++编写并编译成可执行文件。执行等,c#,c++,C#,C++,我们需要在来自c#的服务中运行它,我想知道创建包装器项目是否会有什么不同,这样可以通过c++/CLI项目或p/invoke从c#轻松调用它,或者像从命令行那样启动调用.exe文件的进程 当然,如果只是使用一个名称空间并调用一个负责处理事情的c函数,那么从c#使用它会更容易。我可以很容易地创建一个函数来启动对命令行exe的进程调用,并以这种方式获得结果 这两种方法是否有性能差异,因为这很可能是关键因素,因为我们可以轻松实现这两种方法 另外,使用c++/CLI包装器可以更轻松地传输变量。存在性能差异

我们需要在来自c#的服务中运行它,我想知道创建包装器项目是否会有什么不同,这样可以通过c++/CLI项目或p/invoke从c#轻松调用它,或者像从命令行那样启动调用.exe文件的进程

当然,如果只是使用一个名称空间并调用一个负责处理事情的c函数,那么从c#使用它会更容易。我可以很容易地创建一个函数来启动对命令行exe的进程调用,并以这种方式获得结果

这两种方法是否有性能差异,因为这很可能是关键因素,因为我们可以轻松实现这两种方法


另外,使用c++/CLI包装器可以更轻松地传输变量。

存在性能差异。然而,与所有性能调整一样,关键在于分析。用更简单的方法做,检查是否可以

p/Invoke和C++/CLI方式之间的主要性能差异是编组,这在p/Invoke中是自动的(带有一些定制)

当然,如果只是使用一个名称空间,那么从c#中使用它会更容易 调用一个c#函数来处理事情

这取决于你的应用程序将使用
C++
code做什么。 当然,它将更容易调试

在使用包装器的情况下,性能应该更好,就像在使用EXE的情况下一样,您需要启动EXE,这可能需要一些不相关的时间。对于包装器,在托管代码和非托管代码之间传输数据时存在性能瓶颈。顺便说一句,它应该比可执行运行的要少

所有这些都取决于具体的应用程序生命周期,并且实际上只能由您在具体的上下文中进行度量

我的选择是:

  • 如果调用不太频繁,则将其作为单独的可执行文件保存

  • 另一方面,如果呼叫仍然不那么频繁,但需要通过和调用的数据量足够大,可以考虑包装器。这里,如果您的数据是或可以是文件,EXE的选择可能再次有效,所以您只需将文件路径传递给可执行文件

  • 如果调用足够频繁,请使用包装器


重复一遍,这些只是考虑因素,可能会或不会在您的具体案例中带来一些实际好处。

存在性能差异,但很难判断它们是否重要。您无法避免分析的需要。P/Invoke和C++/Cli-comments很有趣。我倾向于使用c++/CLI,因为我可以选择在代码之间切换。就像一些托管参数一样,在将其传递给本机代码之前,我可以按照我想要的方式对其进行转换。谢谢。这就是我一直在寻找的,结论是我们将在每个案例中都这样做。这是因为我们在数据集上运行不同的算法,有些算法是exe,有些是python,有些是opencv。如果我们能避免它,我们真的只想运行人们扔给我们的东西,并节省时间将其集成到我们选择的语言中。@pksorensen:是的,特别是如果您运行的是本机代码,它与OpenCV等复杂技术紧密结合,如果您有几十个DLL和LIB,将所有这些东西放在一个文件夹中,并通过exe调用它,这可能是一个最佳选择。