Advertisement

几点注意及PInvoker错误

阅读量:

常见需要将C/C++函数打包到动态库中供C#程序调用。一般而言,在编程实践时可以直接采用以下形式实现。为了简化流程和提高效率,在编程实践时可以直接采用以下形式实现。

C#封装调用:

复制代码
 [DllImport("depressor.dll")] //错误调用方式

    
 private static extern void DataDepress(ushort[] data);

在使用过程中经常会遇到找不到所需功能模块的情况,并常常会遇到通过API调用外部库时产生的PInvoke错误,在传递的数据看起来杂乱无章且难以理解时也会出现问题

具体来说,在DLLImport过程中有几个关键参数需要特别关注它们的重要性不言而喻这些参数一旦设定不当就可能导致无法定位所需函数在调用过程中采用何种堆栈机制以及各参数传递过程中的准确性都会受到影响

以下几个问题必须注意:

在DLL中定义函数时, 必须在外部声明中使用‘extern “C”’指令, 否则将在编译时将其视为C++代码处理. 这种情况下, 函数名称会被前缀为_ZxA+_或类似形式, 这会导致在调用时无法正确引用相应的API功能.

在C#编程中进行函数封装时,在函数中应加入CallingConvention = CallingConvention.Cdecl标签,并遵循C语言的调用方式;如果不这样做,

全部评论 (0)

还没有任何评论哟~