【问题标题】:Get functions from lib从库中获取函数
【发布时间】:2012-09-06 11:11:35
【问题描述】:

首先我对 C++ 的了解有限,而且我是 pinvoke 的新手。

我有一个库,其中包含一些非常旧的代码,我们想与 C# 一起使用,但当然它是旧的,它是在未管理的 C++ 中。我正在寻找为 lib 制作一个 C# dll 包装器。所以将来任何想要使用代码的人都可以使用 dll。但是我可以找到如何导出函数来执行 pinvoke。我尝试了垃圾箱,但没有看到任何东西。还是我只需要从代码中获取功能?下面是垃圾箱。

【问题讨论】:

    标签: pinvoke wrapper dumpbin


    【解决方案1】:

    你需要做什么取决于它是什么类型的库。

    1. 如果它是一个静态库,那么您需要构建一个 DLL 并将 .lib 文件链接到该 DLL。然后您的 C# 代码可以 p/invoke 到您构建的 DLL。
    2. 如果它是 DLL 的导入库,那么您只需直接 p/invoke 到 DLL。 .lib 文件在这里对你没有用处。

    【讨论】:

      【解决方案2】:

      这里要小心。 我一直在为 Java 做类似的事情。

      如果您的 C# 代码在 64 位上运行,那么您的 32 位库将无法加载。 最好的选择是如果你能掌握源代码并构建 2 个新版本,一个 32 位和 1 个 64 库。

      如果您无权访问源代码,一种解决方法是创建一个 32 位可执行文件,该可执行文件调用您的 lib 并且可以作为命令行进程调用(将其输出保留在磁盘文件中)。在这种情况下,您可以使用 64 位系统中的 32 位代码。启动新进程等当然会受到惩罚,但取决于调用的频率,这可能是可以接受的。

      【讨论】:

      • 好吧,在这种情况下,除了使 C# 代码面向 x86 之外,您别无选择。然后一切都很好。
      • @DavidHeffernan 在大多数情况下,最终用户和系统管理员都无法接受。我从 Java 经验谈起,但我没有理由认为在 .NET 中会有所不同。现在大多数人都有 64 位操作系统,并且默认安装 64 位运行时环境。您的 x86 库不会在这样的系统上加载,并且大多数人认为在 64 位(虚拟)硬件上安装 32 位运行时是不可接受的。
      • 32 位进程在 64 位 Windows 上运行良好。完全没有问题。
      【解决方案3】:

      “Interop 101”应该可以帮助您:Part 2 使用 P/Invoke 在 C# 中调用非托管 C++ 方法,Part 4 使用 C++/CLI 桥。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-05
        • 1970-01-01
        • 1970-01-01
        • 2021-03-22
        • 2017-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多