-2

I have this doubt ..

I have a C++ library dll and I am writing in my c# web service. I should call my web service a method of this dll. for example using:

[DllImport ("mydll.dll")]
....

but how the type mappings? For example, If That library dll function pointers?

Import and calls the dll adds a overead significant as regards the perdformance?

it may be desirable from the point of view of performance write the web service in C++? using c# I think it's much faster to implement.

4

1 回答 1

0

我想您是在询问编组过程,特别是编组函数指针?CLR 将大多数本机类型编组到它们的托管等效项中。MarshalAs使用该属性可以实现对编组过程的更细粒度的控制。就函数指针而言,您可以使用GetDelegateForFunctionPointer为您的本机函数指针获取托管委托。这是一个例子。

您还询问了与 P/Invoke 相关的性能注意事项。使用 P/Invoke 时显然会有一些开销。这是msdn所说的。

PInvoke 每次调用的开销在 10 到 30 条 x86 指令之间。除了这个固定成本之外,编组还会产生额外的开销。在托管和非托管代码中具有相同表示的 blittable 类型之间没有编组成本。例如,在 int 和 Int32 之间进行转换是免费的。为了获得更好的性能,请使用更少的 PInvoke 调用来编组尽可能多的数据,而不是更多的调用来编组每次调用的更少数据。

总结一下,如果没有您调用的 DLL 的托管等效项,请使用 P/Invoke。为了避免 P/Invoke 对性能的影响,最好只在托管代码中实现 DLL。当然,可能还有其他性能考虑导致您将其实现为本机 DLL。你只需要权衡利弊,做看起来正确的事情。

于 2013-04-08T18:54:14.573 回答