我们可以通过编译包含
等代码的cpp项目来编译C库作为.Net dll(包含并打开对所有C库函数的访问)extern "C" {
#include <library.h>
}
与VS的/clr:pure
参数? (VS10)
或者我们应该做更多的东西?
答案 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要求你:
您的代码(及其库)的当前状态将决定该过程的痛苦程度。
答案 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程序集。