使用以下语法从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);
有更有效的方法吗?
答案 0 :(得分:7)
查看本文,了解如何提高互操作性能。该做什么以及最好避免什么。
答案 1 :(得分:1)
您是在谈论调用本机方法的开销吗?如果是这样,我认为它根本不重要,因为.NET框架类库中有很多这样的调用。
现在,只有通过执行性能测量并将它们与您期望的进行比较,才能回答开销对您的场景是否重要。
答案 2 :(得分:0)
编组到本机方法将耗费NT堆中的三个内存分配,这并不是那么糟糕。这是代表回来的问题。
答案 3 :(得分:0)
检查此类事情的一个好方法是在一个断点进行调用。不知道何时加载库,因此可能只检查第二次调用的断点(除非加载成本是您主要考虑的因素)。然后在visual studio中打开反汇编窗口,看看在调用dll函数之前有多少行。
答案 4 :(得分:0)
我知道这个问题很老,但是我不仅使用calli CIL指令而且还使用特殊技巧成功地快速调用了本机函数,但是如果您处理复杂类型,则必须自己处理pinnig和/或编组参数包括字符串。