【问题标题】:C++/CLI or C# P/Invoke for a big C library, calling an extern function用于大型 C 库的 C++/CLI 或 C# P/Invoke,调用外部函数
【发布时间】:2011-09-14 15:15:14
【问题描述】:

现在我知道有很多关于这方面的问题,但总的来说它们指的是 c++ 库。

我有一个相当重要的 C dll(大约 2800 个函数),我需要为其中大约 70 个可在 C# 中调用的 API 创建一个 API。我开始使用 P/Invoke,但它非常乏味,因为我有复杂的结构要从 C 代码传递和返回(带有指向其他指针的结构、双指针等),而且我花了很多时间来获得我需要的东西。

现在我根本不懂 C++/CLI,但我对 C++ 有一点经验(虽然不多)。

我想知道是否值得为我的项目努力学习这一点。使用 C++ 包装器是否能让我不必为编组结构、在全局堆中分配指针等而苦苦挣扎?......

非常感谢这个伟大的社区

【问题讨论】:

    标签: c dll c++-cli pinvoke


    【解决方案1】:

    这是一个相当大的表面积。我认为 C++/CLI 会比 P/invoke 更容易。您不需要使用任何 C++ 功能,您可以编写本质上是 C 的内容并使用 C++/CLI 编译和导出。

    【讨论】:

    • 谢谢。只是为了确保我能让你好起来,我需要做的是在 C++/CLI 中编译我当前的 dll 吗?一旦我有了这些,就可以在 C# 中使用了吗?还是我需要编写 C++ 类?我读过的关于 C++/CLi 包装器的文章都提到为每个现有的 C++ 类创建一个类......因为我没有任何类,所以我不知道如何去做......如果你有教程或例如,它会很棒!
    • 是的,@Ben 说的也很好。如果您的 C DLL 被应用程序的其他部分使用,那么您可能希望保留它。否则,将对象直接链接到 C++/CLI 代码是理想的。
    • @Nchekwube:您链接一个 .lib 文件,或者是包含 C 函数的目标代码,或者是告诉编译器如何在运行时在 DLL 中查找这些函数的导入库。当您构建 C 代码时,链接器应在 DLL 旁边生成一个导入库。
    • 在使用 C 头文件时,您很可能需要extern "C" { #include "Ccode.h" },否则名称修改会导致问题。
    • 哇好...感谢所有的帮助。回顾一下:我有一个 C dll。 extern "C" {} 已经在其中以导出功能。现在如何在 Visual Studios c++/cli 库项目中进行链接?
    【解决方案2】:

    很难处理来自 C# 的本机结构。因此编写 C++/CLI 包装器更容易。您可以毫不费力地将这些结构转换/包装为ref classes,然后在 C# 中使用它们。

    void some_function(Some_Struct * ss)
    {
      //...
    }
    
    struct Some_Struct
    {
      int intVal;
      double dblVal;
    }
    
    //C++/ClI
    public ref class Wrapper
    {
      public:
        void CallSomeFunction(int intval, double doubleval)
        {
          Some_Struct * ss = new Some_Struct(); // maybe malloc is more appropriate.
          ss->intVal = intval;
          ss->dblVal = doubleval;
          some_function(ss);
          delete ss; // or Free(ss);
        }
    }
    
    //C#
    Wrapper wrapper = new Wrapper();
    wrapper.CallSomeFunction(10,23.3);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      • 2010-10-08
      相关资源
      最近更新 更多