我怀疑......
我有一个C++
库dll,我正在我的c#
网络服务中写作。
我应该将我的Web服务称为此dll的方法。
例如使用:
[DllImport ("mydll.dll")]
....
但是类型映射怎么样?例如,如果那个库dll函数指针?
导入并调用dll会增加对性能的重要性?
从性能的角度来看,可能需要在C++
中编写Web服务?
使用c#
我认为实施起来要快得多。
答案 0 :(得分:0)
我认为你在询问编组过程,特别是关于编组函数指针的问题? CLR marshals大多数本机类型都包含在其托管等价物中。使用MarshalAs
属性可以实现对编组过程的更精细控制。就函数指针而言,您可以使用GetDelegateForFunctionPointer来获取本机函数指针的托管委托。 Here's这是一个例子。
您还询问了与P / Invoke相关的性能注意事项。使用P / Invoke时显然有一些开销。这是msdn所说的内容。
PInvoke每次调用的开销为10到30 x86。除了这个固定成本之外,编组还会产生额外的开销。在管理和非托管代码中具有相同表示的blittable类型之间没有编组成本。例如,在int和Int32之间进行转换没有成本。 为了获得更好的性能,请尽可能少地编组尽可能多的数据的PInvoke调用,而不是每次调用编组较少数据的更多调用。
要结束,如果没有您要调用的DLL的托管等效项,请使用P / Invoke。为了避免P / Invoke的性能损失,在托管代码中实现DLL可能是个好主意。当然可以有其他性能考虑因素导致您将其实现为本机DLL。你只需要权衡利弊,做正确的事情。