【发布时间】: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
我们是否可以通过编译包含类似代码的 cpp 项目将 C 库编译为 .Net dll(包含并打开对所有 C 库函数的访问)
extern "C" {
#include <library.h>
}
与/clr:pure 参数与VS? (VS10)
或者我们应该做一些更棘手的事情?
【问题讨论】:
标签: .net c++ c visual-studio clr
您可能对此感兴趣: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函数
【讨论】:
我发现最好使用旧样式的托管 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 只是表明这是一个托管类,是旧式语法的一部分。您可以在 Reflector 中查看。将是“模块”命名空间中名为 Foo 的内部类。
这真的取决于你的 C 代码。
P/Invoke 通常是最容易上手的,而 IMO 对于少数几个功能非常适用。性能不一定很好,我不会用它来构建一个完整的程序 - 但是重用一些功能,这是值得的。
从 C 转到 /clr:pure 需要您:
您的代码(及其库)的当前状态将决定该过程的痛苦程度。
【讨论】:
DllImport 不会让你到达那里。
通常情况下,您甚至可以在不进行一些更改的情况下将 C 代码编译为 C++。如果您可以将 C 代码编译为 C++,那么您可以尝试将其编译为 C++/CLI(这就是 clr:pure 选项的作用)。
此时,您可以创建某种类,将所有导出的函数公开为公共(托管)类的静态方法。
这类东西的某些风格可以使用 C++ 预处理器技巧(宏等)来完成,有时您最终会手动编写包装器。
因此,您可以使用 /clr:xxx 选项将 C++ 编译为 .NET 程序集的基本信息是正确的,但这并不意味着您需要做的就是获得有用的 .NET 程序集。
【讨论】: