从 C# 调用非托管 .dll 的性能

Posted

技术标签:

【中文标题】从 C# 调用非托管 .dll 的性能【英文标题】:Performance of Calling Unmanaged .dll from C# 【发布时间】:2010-03-03 22:51:46 【问题描述】:

使用以下语法从 C# 应用程序调用用 C++ 编写的 .dll 会增加多长时间?

[DllImport("abc.dll", EntryPoint = "xcFoo", CallingConvention = CallingConvention.Cdecl)]
public extern static Result Foo(out IntPtr session,
                [MarshalAs(UnmanagedType.FunctionPtr)]ObjectCallback callback, 
                UInt64 turnKey,
                string serverAddress, 
                string userId, 
                string password);

有没有更有效的方法?

【问题讨论】:

【参考方案1】:

查看这篇文章,了解如何提高互操作性能。应该做什么以及最好避免什么。

http://msdn.microsoft.com/en-us/library/ms998551.aspx

【讨论】:

【参考方案2】:

您是在谈论调用本机方法的开销吗?如果是这样,我认为这根本不重要,因为.NET框架类库中有很多这样的调用。

现在,只能通过进行性能测量并将其与您的预期进行比较来回答开销对您的方案是否重要。

【讨论】:

【参考方案3】:

编组到本机方法将花费来自 NT 堆的三个内存分配,这还不错。令人担心的是代表回来。

【讨论】:

【参考方案4】:

检查这类事情的一个好方法是在你进行调用的地方设置一个断点。不知道何时加载库,所以可能只检查第二次调用的断点(除非加载成本是您主要关心的问题)。然后在visual studio中打开反汇编窗口,看看你的dll函数被调用之前有多少行。

【讨论】:

【参考方案5】:

我知道这个问题很老了,但我设法以极快的速度调用本机函数,不仅使用 calli CIL 指令,还使用特殊技巧,但是如果你处理复杂类型,你需要自己处理 pinnig 和/或编组参数包括字符串..

【讨论】:

以上是关于从 C# 调用非托管 .dll 的性能的主要内容,如果未能解决你的问题,请参考以下文章

从 c# dll 调用/编组字符串到非托管代码

从 C# 调用非托管 DLL,将结构作为参数传递

从 C# 调用非托管 C++ VS 6.0 MFC dll

使用非托管 C++ .dll 从 C# .exe 调用函数

调用使用 C# 返回结构数组的非托管 dll 函数

从 C# 线程内的非托管 dll 运行函数