【问题标题】:A way How to Compile C library into .Net dll?一种方法如何将 C 库编译成 .Net dll?
【发布时间】:2010-07-13 09:43:00
【问题描述】:

我们是否可以通过编译包含类似代码的 cpp 项目将 C 库编译为 .Net dll(包含并打开对所有 C 库函数的访问)

extern "C" {
#include <library.h>
}

/clr:pure 参数与VS? (VS10)

或者我们应该做一些更棘手的事情?

【问题讨论】:

    标签: .net c++ c visual-studio clr


    【解决方案1】:

    您可能对此感兴趣:Compiling your C code to .NET

    创建一个C编译器occil.exe

    从 c 代码创建 .NET dll,例如 stack.c

    Step1:将 stack.c 编译成 IL 代码

    occil /ostackdll.il /c /Wd /9 /NStackLib.Stack stack.c
    

    Step2:将生成的 IL 代码构建为 .NET DLL

    ilasm /DLL stackdll.il
    

    然后就可以在c#程序中引用stack.dll,调用stack.c中的C函数

    【讨论】:

      【解决方案2】:

      我发现最好使用旧样式的托管 C++。

      CLR:PURE 就是不会剪。

      例子:

      extern "C" int _foo(int bar)
      {
        return bar;
      }
      
      namespace Bar
      {
        public __gc class Foo
        {
        public:
          Foo() {}
      
          static int foo(int bar)
          {
            return _foo(bar);
          }
        };
      };
      

      编译:/clr:oldSyntax

      现在您可以引用程序集,并从 .NET 调用 Bar.Foo.foo()

      【讨论】:

      • 这是什么意思 - 请提供简单的示例?
      • 你能解释一下'__gc'是什么,这段代码将如何编译成.net dll(我的意思是我们将在其中访问什么以及如何访问?)
      • @Ole Jak: __gc 只是表明这是一个托管类,是旧式语法的一部分。您可以在 Reflector 中查看。将是“模块”命名空间中名为 Foo 的内部类。
      • @Ole Jak:我添加了一个命名空间并将其公开,因此可以更轻松地进行测试。
      • 我喜欢你的回答 - 这是一种使用 Visual Studio 工具从纯 C 代码到 C++ 代码创建 .Net 库的快速简便的方法。会尽快尝试。非常感谢!
      【解决方案3】:

      这真的取决于你的 C 代码。

      P/Invoke 通常是最容易上手的,而 IMO 对于少数几个功能非常适用。性能不一定很好,我不会用它来构建一个完整的程序 - 但是重用一些功能,这是值得的。

      从 C 转到 /clr:pure 需要您:

      1. Convert your C code to C++
      2. Convert your C++ code to Visual C++
      3. Compile with /clr option
      4. Compile with /clr:pure

      您的代码(及其库)的当前状态将决定该过程的痛苦程度。

      【讨论】:

      • "thay" 说你不需要 P/Invoke 来使用 .Net dll。 “thay”表示您可以使用 VS 的 'clr:pure' 参数将 C++(CPP 文件)代码编译成 .Net dll。
      • @Ole - “他们”是正确的。它从 C 语言发展到这一点,这很可能会让你大吃一惊。
      • 在他的其他(我已经数不清,可能有五个)关于此的问题中,Ole 提出了一个要求,即所有内容都编译到一个文件中。 DllImport 不会让你到达那里。
      【解决方案4】:

      通常情况下,您甚至可以在不进行一些更改的情况下将 C 代码编译为 C++。如果您可以将 C 代码编译为 C++,那么您可以尝试将其编译为 C++/CLI(这就是 clr:pure 选项的作用)。

      此时,您可以创建某种类,将所有导出的函数公开为公共(托管)类的静态方法。

      这类东西的某些风格可以使用 C++ 预处理器技巧(宏等)来完成,有时您最终会手动编写包装器。

      因此,您可以使用 /clr:xxx 选项将 C++ 编译为 .NET 程序集的基本信息是正确的,但这并不意味着您需要做的就是获得有用的 .NET 程序集。

      【讨论】:

      • 在博客文章或类似内容中是否有任何一步一步的 tuts 或成功故事?
      猜你喜欢
      • 1970-01-01
      • 2015-05-01
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多