为什么此封送处理在Mono中起作用,但在MS上失败?

Borrrden

我将其简化为一个简单的示例。我正在C#和C之间编写一些互操作代码,并且在非托管方面有以下非常简单的结构:

typedef struct {
    bool create_if_missing;
    fdb_custom_cmp_variable custom_cmp;
} fdb_kvs_config;

typedef int (*fdb_custom_cmp_variable)(void *a, size_t len_a,
                                   void *b, size_t len_b);

因此,我在托管端创建了此代码:

public struct fdb_kvs_config
{
    [MarshalAs(UnmanagedType.I1)]
    public bool create_if_missing;

    [MarshalAs(UnmanagedType.FunctionPtr)]
    public IntPtr custom_cmp;
}

我想使用这个非托管功能

extern __declspec(dllexport)
fdb_kvs_config fdb_get_default_kvs_config(void);

所以我有这个等价物:

[DllImport("forestdb", CallingConvention=CallingConvention.Cdecl)]
public static extern fdb_kvs_config fdb_get_default_kvs_config();

但是,这将引发异常:

ForestDB.Test.exe中发生了类型为'System.Runtime.InteropServices.MarshalDirectiveException'的未处理异常

附加信息:方法的类型签名与PInvoke不兼容。

注意:我尝试过各种MarshalAs组合,但没有运气。另请注意,我只负责C#方面的工作,C API是由其他人开发的,因此我无法控制它。

如果此简单签名与P / Invoke不兼容,那么到底是什么呢?为了获得奖励积分,为什么它可以在Mono的OS X上运行?

Borrrden

好吧,你知道什么。原来MarshalAs竟是问题,使得属性在Windows上几乎无用。受管端的结构的所有成员都必须是可Blittable类型的这种限制显然在Mono上不存在。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么此ftp get命令在我的shell脚本中起作用但在cron中失败

来自分类Dev

为什么此CURL在PHP中起作用但在shell中不起作用

来自分类Dev

为什么此CURL在PHP中起作用但在shell中不起作用

来自分类Dev

为什么此shell脚本在bash中失败,但是命令在SSH中起作用?

来自分类Dev

为什么此搜索在MS Word 2016中不起作用?

来自分类Dev

为什么此批处理标记不起作用?

来自分类Dev

为什么findOne()在withTracker()部分中不起作用,但在render()方法中却起作用?

来自分类Dev

为什么.save在Mongoose中起作用但在带有upsert的.update中不起作用

来自分类Dev

为什么请求在 laravel 中不起作用,但在 pgAdmin 中起作用?

来自分类Dev

PInvoke DllExport:结构封送处理失败

来自分类Dev

为什么img上的onclick处理程序不起作用?

来自分类Dev

为什么此Javascript在Firefox中不起作用?

来自分类Dev

为什么提取此方法在gradle中不起作用?

来自分类Dev

为什么在Polymer中此CodeLab示例不起作用?

来自分类Dev

为什么解密功能中的此循环不起作用?

来自分类Dev

为什么此C代码在JavaScript中不起作用?

来自分类Dev

为什么此jQuery在Codeigniter中不起作用?

来自分类Dev

为什么此.slideToggle函数在jQuery中不起作用?

来自分类Dev

为什么此查询在PHPMyAdmin中不起作用

来自分类Dev

为什么此Regex在R中不起作用

来自分类Dev

为什么此多处理代码失败?

来自分类Dev

当我在WHERE子句上使用属性时,为什么会出现转换失败错误,但在不使用时会起作用?

来自分类Dev

为什么此脚本在终端中起作用,但不能在文件中起作用?

来自分类Dev

为什么此功能在runghc中起作用而在ghci中不起作用?

来自分类Dev

为什么错误处理在Laravel中不起作用

来自分类Dev

为什么此单行函数在zsh中有效,但在bash中不起作用,如何为bash修复它?

来自分类Dev

为什么此NotificationListenerService不起作用

来自分类Dev

为什么此SQL起作用?

来自分类Dev

为什么此for循环不起作用?

Related 相关文章

  1. 1

    为什么此ftp get命令在我的shell脚本中起作用但在cron中失败

  2. 2

    为什么此CURL在PHP中起作用但在shell中不起作用

  3. 3

    为什么此CURL在PHP中起作用但在shell中不起作用

  4. 4

    为什么此shell脚本在bash中失败,但是命令在SSH中起作用?

  5. 5

    为什么此搜索在MS Word 2016中不起作用?

  6. 6

    为什么此批处理标记不起作用?

  7. 7

    为什么findOne()在withTracker()部分中不起作用,但在render()方法中却起作用?

  8. 8

    为什么.save在Mongoose中起作用但在带有upsert的.update中不起作用

  9. 9

    为什么请求在 laravel 中不起作用,但在 pgAdmin 中起作用?

  10. 10

    PInvoke DllExport:结构封送处理失败

  11. 11

    为什么img上的onclick处理程序不起作用?

  12. 12

    为什么此Javascript在Firefox中不起作用?

  13. 13

    为什么提取此方法在gradle中不起作用?

  14. 14

    为什么在Polymer中此CodeLab示例不起作用?

  15. 15

    为什么解密功能中的此循环不起作用?

  16. 16

    为什么此C代码在JavaScript中不起作用?

  17. 17

    为什么此jQuery在Codeigniter中不起作用?

  18. 18

    为什么此.slideToggle函数在jQuery中不起作用?

  19. 19

    为什么此查询在PHPMyAdmin中不起作用

  20. 20

    为什么此Regex在R中不起作用

  21. 21

    为什么此多处理代码失败?

  22. 22

    当我在WHERE子句上使用属性时,为什么会出现转换失败错误,但在不使用时会起作用?

  23. 23

    为什么此脚本在终端中起作用,但不能在文件中起作用?

  24. 24

    为什么此功能在runghc中起作用而在ghci中不起作用?

  25. 25

    为什么错误处理在Laravel中不起作用

  26. 26

    为什么此单行函数在zsh中有效,但在bash中不起作用,如何为bash修复它?

  27. 27

    为什么此NotificationListenerService不起作用

  28. 28

    为什么此SQL起作用?

  29. 29

    为什么此for循环不起作用?

热门标签

归档