我正在使用名为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#
,但是想知道是否会有一个很大的区别处理时间。
答案 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所示。
运行时拦截对非托管代码的调用并识别 导出名称表中的目标方法。如果匹配的方法名称是 发现,该方法被调用。对于接受ANSI字符串的方法 参数,运行时搜索“methodName”和“methodNameA”。 对于接受Unicode字符串参数的方法,它会搜索 “methodName”和“methodNameW。”
参数被封送。这些参数可以标记为[in], [出],或参考。 Blittable类型(例如System.Byte和 System.Int32)不需要编组并直接传递 跨越非托管代码。非blittable类型(如 System.Array)基于默认编组进行封送(转换) 可以使用属性指定的规则和编组提示 例如[MarshalAs(UnmanagedType.LPStr)]。
执行本机代码。
- 醇>
返回值被封送回来。这包括任何参数 标记为ByRef,[out]或[in] [out]以及返回值, 如果有的话。