一种如何将C库编译成.Net dll的方法?

时间:2010-07-13 09:43:00

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

我们可以通过编译包含

等代码的cpp项目来编译C库作为.Net dll(包含并打开对所有C库函数的访问)
extern "C" {
#include <library.h>
}

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

或者我们应该做更多的东西?

4 个答案:

答案 0 :(得分:4)

您可能会对此感兴趣: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函数。

答案 1 :(得分: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
  5. 您的代码(及其库)的当前状态将决定该过程的痛苦程度。

答案 2 :(得分:3)

我发现最好使用旧式Managed 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);
    }
  };
};

编译:{{1​​}}

现在您可以引用assebmly,并从.NET调用/clr:oldSyntax

答案 3 :(得分:1)

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

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

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

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