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

时间:2010-03-03 22:51:47

标签: c# c++ interop unmanaged managed

使用以下语法从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);

有更有效的方法吗?

5 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:1)

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

现在,只有通过执行性能测量并将它们与您期望的进行比较,才能回答开销对您的场景是否重要。

答案 2 :(得分:0)

编组到本机方法将耗费NT堆中的三个内存分配,这并不是那么糟糕。这是代表回来的问题。

答案 3 :(得分:0)

检查此类事情的一个好方法是在一个断点进行调用。不知道何时加载库,因此可能只检查第二次调用的断点(除非加载成本是您主要考虑的因素)。然后在visual studio中打开反汇编窗口,看看在调用dll函数之前有多少行。

答案 4 :(得分:0)

我知道这个问题很老,但是我不仅使用calli CIL指令而且还使用特殊技巧成功地快速调用了本机函数,但是如果您处理复杂类型,则必须自己处理pinnig和/或编组参数包括字符串。