A way How to Compile C library into .Net dll?

蓝咒 提交于 2019-11-30 21:30:51

I found it is the best to use the old style Managed C++ for this.

CLR:PURE just wont cut it.

Example:

extern "C" int _foo(int bar)
{
  return bar;
}

namespace Bar
{
  public __gc class Foo
  {
  public:
    Foo() {}

    static int foo(int bar)
    {
      return _foo(bar);
    }
  };
};

Compile with: /clr:oldSyntax

Now you can reference the assebmly, and call Bar.Foo.foo() from .NET.

This may be of interest to you: Compiling your C code to .NET

Create a C compiler occil.exe

To create a .NET dll from a c code e.g stack.c

Step1: build stack.c to IL code

occil /ostackdll.il /c /Wd /9 /NStackLib.Stack stack.c

Step2: build to generated IL code to .NET DLL

ilasm /DLL stackdll.il

Then you can reference the stack.dll in a c# program and call the C function in stack.c

It really depends on your C code.

P/Invoke is often the easiest to start with, and IMO is pretty workable for a handful of functions. Performance isn't necessarily great, and I wouldn't construct an entire program out of it - but to reuse some functions, it's worthwhile.

Going from C to /clr:pure requires you to:

  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

The current state of your code (and it's libraries) will dictate how painful that process is.

It's not generally a given that you can even compile C code as C++ without making some changes. If you can get your C code to compile as C++, then you can try getting it to compile as C++/CLI (that's what the clr:pure option does).

At that point, you can create some kind of class which exposes all your exported functions as static methods of a public (managed) class.

Some flavours of this sort of stuff can be done with C++ preprocessor tricks (macros, etc), sometimes you end-up writing wrappers manually.

So the basic information that you can compile C++ into .NET assemblies using /clr:xxx options is true, but that doesn't mean it's the only thing you need to do to get a useful .NET assembly.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!