Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从C调用非托管.dll的性能# 使用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);_C#_C++_Interop_Unmanaged_Managed - Fatal编程技术网

C# 从C调用非托管.dll的性能# 使用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);

C# 从C调用非托管.dll的性能# 使用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);,c#,c++,interop,unmanaged,managed,C#,C++,Interop,Unmanaged,Managed,有更有效的方法吗?您是在谈论调用本机方法的开销吗?如果是这样,我认为这一点都不重要,因为在.NETFramework类库中有很多这样的调用 现在,对于您的场景来说,开销是否重要,只能通过进行性能测量,并将它们与您期望的进行比较来回答。将数据编组到本机方法将消耗NT堆中的三次内存分配,这并不坏。让人担忧的是委托返回。查看这篇关于如何提高互操作性能的文章。该做什么,最好避免什么 检查这类事情的一个好方法是在你打电话的地方插入一个断点。不知道库何时加载,所以可能只在第二次调用时检查断点(除非加载成本是

有更有效的方法吗?

您是在谈论调用本机方法的开销吗?如果是这样,我认为这一点都不重要,因为在.NETFramework类库中有很多这样的调用


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

将数据编组到本机方法将消耗NT堆中的三次内存分配,这并不坏。让人担忧的是委托返回。

查看这篇关于如何提高互操作性能的文章。该做什么,最好避免什么


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

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