使用非托管" dll"在处理时间。

时间:2015-10-28 15:50:53

标签: c# .net dllimport

我正在使用名为unmanaged dll的{​​{1}}。 为了从VTC7200_IO.dll获取函数,我使用下面编写的代码(例子)

dll

我的问题是,当您重复导入 [DllImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool AllocConsole(); // Intialise IO Library [DllImport("VTC7200_IO.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "Library_Initial", CharSet = CharSet.Ansi)] public static extern int Library_Initial(); 文件时,processing time会发生什么。任何人都可以给出一个dll答案,因为我正在开始一个项目并且正在考虑使用conclusive代替C#,但是想知道是否会有一个很大的区别处理时间。

2 个答案:

答案 0 :(得分:3)

如果性能是您所担心的,那么您不应该将P / Invoke与C#一起使用,而是使用C ++ / CLI编写包装器。来自MSDN

  

... C ++ Interop使用最快的数据编组方法,而P / Invoke使用最强大的方法。这意味着C ++ Interop(以典型的C ++方式)默认提供最佳性能,程序员负责解决此行为不安全或不合适的情况。

我无法在性能上给出确切的数字,但只是如果你使用了大量的非托管调用,那么将它包装在C ++ / CLI类中会更高效(但不太开箱即用)而不仅仅是使用P / Invoke

答案 1 :(得分:3)

非托管程序集不会“重复加载”。但是,他们确实遭受了类型封送。你可能应该参考Microsoft Patterns & Practices, Chapter 7 - Improving Interop Performance更好地解释P / Invoke的性能考虑(并且相当详细)。

从那篇文章:

  

该过程包括以下步骤,如图7.1所示。

     
      
  1. 运行时拦截对非托管代码的调用并识别   导出名称表中的目标方法。如果匹配的方法名称是   发现,该方法被调用。对于接受ANSI字符串的方法   参数,运行时搜索“methodName”和“methodNameA”。   对于接受Unicode字符串参数的方法,它会搜索   “methodName”和“methodNameW。”

  2.   
  3. 参数被封送。这些参数可以标记为[in],   [出],或参考。 Blittable类型(例如System.Byte和   System.Int32)不需要编组并直接传递   跨越非托管代码。非blittable类型(如   System.Array)基于默认编组进行封送(转换)   可以使用属性指定的规则和编组提示   例如[MarshalAs(UnmanagedType.LPStr)]。

  4.   
  5. 执行本机代码。

  6.   
  7. 返回值被封送回来。这包括任何参数   标记为ByRef,[out]或[in] [out]以及返回值,   如果有的话。

  8.