Amil
Amil

Reputation: 503

Writing a C++ DLL that a C# .NET Application can call?

This is the situation. I am writing a backend application in C++ and my colleagues are using C# for the frontend. Basically, my backend application does image processing on images received from the C# frontend and returns a text file with data about the image. What we were doing earlier was writing the images to disk and calling the C++ application with the file path of the image as a parameter. However, this writing/reading from disk has become a bottleneck, so we are wanting to convert the C++ application to a DLL.

At the basic level, what I want is to expose a single method from my C++ application to the C# one through a DLL (the C# application is web-based):

int ProcessImage(System::Bitmap^ image, System::String ^results)

How can I go about doing this? I am using VC++ Express 2008 and my C++ code currently compiles with CLR (although I have mixed a lot of native C++ code inside).

I have been looking around on the web, but am still stuck on how to do this. I think a C++/CLI DLL is the best option, but how do I do this? Writing a DLL in C/C++ for .Net interoperability

Upvotes: 1

Views: 3162

Answers (2)

Amil
Amil

Reputation: 503

I finally figured it out. What you need to do is:

  1. In your C++ project, set the option in Visual C++ to compile with clr pure, which makes the project a C++/CLI one
  2. In your C++ project, expose methods by creating a public ref class:

    public ref class Interop
    {
    public:
        //! Returns the version of this DLL
        static System::String^ GetVersion() {
            return "3.0.0.0";
        }
    
        //! Processes an image (passed by reference)
        System::Int32^ Process(Bitmap^ image);
    }
    
  3. In a C# program, add a reference to the C++ DLL you compiled
  4. In the C# program, call these methods (i.e. Interop::Process(myBitmapInCS))

I believe this method is called "implicit P/Invoke" Hope this helps!

Upvotes: 1

Nick Whaley
Nick Whaley

Reputation: 2799

If you label your C++ function as a "C" function, then it can be called by PInvoke.

Your C function will look like this:

extern "C" __declspec(dllexport) int Test() {
    return 1;
}

Your C# reference will be like this:

[DllImport("test.dll")]
public static extern int Test();

If you C++ function is an instance member, then you can still do it but it requires some tricks.

Upvotes: 2

Related Questions