C#Web服务和DLL库

时间:2013-04-08 18:17:49

标签: c# c++ visual-studio-2010 dll dllimport

我怀疑......

我有一个C++库dll,我正在我的c#网络服务中写作。 我应该将我的Web服务称为此dll的方法。 例如使用:

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

但是类型映射怎么样?例如,如果那个库dll函数指针?

导入并调用dll会增加对性能的重要性?

从性能的角度来看,可能需要在C++中编写Web服务? 使用c#我认为实施起来要快得多。

1 个答案:

答案 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。你只需要权衡利弊,做正确的事情。