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

Posted

技术标签:

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

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

extern "C" 
#include <library.h>

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

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

【问题讨论】:

【参考方案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 需要您:

    Convert your C code to C++ Convert your C++ code to Visual C++ Compile with /clr option 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 或成功故事?

以上是关于一种方法如何将 C 库编译成 .Net dll?的主要内容,如果未能解决你的问题,请参考以下文章

用C语言如何写DLL动态链接库?VB.net 又如何调用其生成的DLL库?急急急!!!!在线等!!

如何将 .cpp 源文件编译成 .dll?

Cygwin下用CMake编译库

c++代码反编译

如何在 vNext 中将所有 cshtml 文件编译成 DLL 或 .net 程序集?

怎么将qt的开源库封装成dll