Search code examples
cdllc++-clipinvoke

C++/CLI or C# P/Invoke for a big C library, calling an extern function


Now I know there are quite a few questions regarding this but in general they refer to c++ libraries.

I have a fairly important C dll (approximately 2800 functions) and I need to make an API for about 70 of these callable in C#. I started off using P/Invoke but it's pretty tedious because I have complex structures to pass and return from the C code (structures with pointers to others, double pointers, etc) and it's taking me alot of time to get what I need.

Now I don't know C++/CLI at all but I have a bit of experience with C++ (not a lot though).

I am wondering if it's worth making the effort to learn this for my project. Will using a C++ wrapper enable me not to have to struggle with marshalling structures, allocating pointers in global heap, etc or not?....

Thanks a lot and big ups to this great community


Solution

  • It is hard to deal with native structs from C#. So writing a C++/CLI wrapper is easier. You can convert/wrap those structs to ref classes without too much trouble and use them in C#.

    void some_function(Some_Struct * ss)
    {
      //...
    }
    
    struct Some_Struct
    {
      int intVal;
      double dblVal;
    }
    
    //C++/ClI
    public ref class Wrapper
    {
      public:
        void CallSomeFunction(int intval, double doubleval)
        {
          Some_Struct * ss = new Some_Struct(); // maybe malloc is more appropriate.
          ss->intVal = intval;
          ss->dblVal = doubleval;
          some_function(ss);
          delete ss; // or Free(ss);
        }
    }
    
    //C#
    Wrapper wrapper = new Wrapper();
    wrapper.CallSomeFunction(10,23.3);