一种方法如何将 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库?急急急!!!!在线等!!