Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Use C++/CLI Within C# Application

I am trying to call my C++ library from my C# application (via C++/CLI). I followed the example from this question (for my specific application). The setup of my application is:

  • Project1: C++ Project (I compile this to a DLL)
  • Project2: C++ Project (my CLR wrapper; just the header file per the example above; references Project1)
  • Project3: C# Project (references Project2)

Unfortunately, when I actually go to access the CLR wrapper object in my C# application, I receive the following error:

The type or namespace name 'YourClass' could not be found (are you missing a using directive or an assembly reference?)

Do I have the project setup incorrectly, or is there something else I should be looking into? (Unfortunately, I cannot post the code for proprietary reasons, but it is a very simple bit of code and easily follows the above example.)

Update:

So I did exactly what Chris said to do (see answer below), but I am still receiving a message from my C# application that "The type or namespace name 'MyProgram' could not be found (are you missing a using directive or an assembly reference?). Here is a (mock-up) of my code.

  • Project1 - This is my C++ application. It compiles/works. I have used it elsewhere. (I get a DLL out of this build.)
  • Project2 - Here is my code for my wrapper.

MyWrapper.h

#pragma once

#include "myorigapp.h"

using namespace System;

namespace MyProgram
{
    public ref class MyWrapper
    {
    private:
        myorigapp* NativePtr;

    public:
        MyWrapper() 
        {
            NativePtr = new myorigapp();
        }

        ~MyWrapper() 
        { 
            delete NativePtr;
            NativePtr = NULL;
        }

        void dostuff()
        { 
            NativePtr->dostuff(); 
        }
    }
}
  • Project3 - This is my C# application.

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using MyProgram;

namespace Testing
{
    class Program
    {
        static void Main(string[] args)
        {
            MyWrapper p = new MyWrapper();
            p.dostuff();
        }
    }
}

Project3 references Project2 which references Project1. Everything builds without errors (except the error I described above in the C# code on the using MyProgram line).

like image 440
JasCav Avatar asked Apr 13 '11 21:04

JasCav


Video Answer


1 Answers

Just including the header from a pure C++ application isn't good enough. You need to wrap your unmanaged objects with managed ones in Project2 (i.e. public ref class YourClassDotNet)

#include "YourHeader.h"

namespace MyManagedWrapper
{
    public ref class YourClassDotNet
    {
    private:
        YourClass* ptr;

    public:
        YourClassDotNet()
        {
            ptr = new YourClass();
        }

        ~YourClassDotNet()
        {
            this->!YourClassDotNet();
        }

        !YourClassDotNet()
        {
            delete ptr;
            ptr = NULL;
        }

        void SomeMethod()
        {
            ptr->SomeMethod();
        }
    }
}
like image 88
Chris Eberle Avatar answered Sep 17 '22 17:09

Chris Eberle