代码之家  ›  专栏  ›  技术社区  ›  HCL

使用P/Invoke的缺点是什么

  •  4
  • HCL  · 技术社区  · 14 年前

    我已经在使用.net框架了。在这段时间,有些情况下,我使用P/Invoke来完成托管代码无法完成的任务。

    如果我在谷歌上搜索,我会发现很多关于它的帖子,有些人会画出一幅灾难性的图画,并建议永远不要使用它。使用一个或多个P/Invoke调用的应用程序的主要缺点和问题是什么?它们何时应用。(不是从性能的角度,更多的是以“无法从网络共享执行”的方式)?

    2 回复  |  直到 14 年前
        1
  •  13
  •   Gabe Timothy Khouri    14 年前
    1. 托管/非托管类型之间的封送有额外的开销
    2. 在查看导出的C函数时
    3. 什么时候出问题 migrating from x86 to x64
    4. 当出现问题时,您不能简单地进入非托管代码进行调试并理解出现异常的原因。你甚至不能在反射器中打开它:-)

    结论:仅在没有托管替代方案或性能关键型应用程序(其中只有非托管库可提供所需的速度)中使用。

        2
  •  4
  •   Kate Gregory    14 年前

    使用P/Invoke有三种不同的场景,每种场景都有不同的缺点。

    1. 您需要使用.NET Framework中未提供的Windows功能。你唯一的选择是P/Invoke,你的缺点是现在你的应用程序只能在Windows上运行。

    2. 您需要使用其他人提供给您的C样式的DLL,并且没有托管的等价物。现在你必须用你的应用程序来部署这个DLL,并且你有编组时间的问题,在你的函数声明(比如IntPtr/int)中可能出现的错误,字符串编组,以及其他人们觉得困难的事情。

    3. 您编写或控制了一些旧的本机代码,您希望从托管代码中访问它们而不进行移植。这里有(2)的所有问题,但是您可以选择移植它。我要断言的是,移植它会导致比P/调用更严重的错误。如果要移植的代码对诸如CRT之类的本机代码进行大量调用,那么还可能导致更大的性能问题。