Reputation: 5519
I have a windows forms app written in C++/cli. I want to extend this app with some new forms and I'd like to create them in C# in a separate project.
Is it possible to simply add a C# project to a solution that has the C++ project and the two will interact? By interaction, I mean that, say, a button clicked on a form written in the c# project will be able to call methods in the c++ project. Asked perhaps in a different way, can an object in the C# project reference an object in the c++ project?
Upvotes: 16
Views: 17732
Reputation: 701
Yes. A C++/CLI application will be able to interface with a C# application, in one of two ways:
If you are using CLI extensions (which from your post it sounds like it), you will be able to write code using the new object references:
Managed objects: System::String^ myString
(in C++) is the same as string myString
in C#
Managed refs: System::String% myString
is equivalent to ref string myString
.
If you want to use C++ native types, then you will have to use P/Invoke, but that's an entirely different category. For what you want to do, just add the C++ project as a reference to your C# project, write a publicly-visible class in C++ using managed types, and then compile. Your project should then be visible to your C# class in whatever namespace you chose for the C++ class.
Oh, and if you need to allocate managed objects through C++, you will need to use gcnew
instead of new
.
Upvotes: 11
Reputation: 5421
This can be done by compiling a dll with the C++ project, then having the C# app load that dll and then it will be able to call its exported functions. This method allows your C++ code to be unmanaged code.
As far as finding a sample that is already set up, I can only find a Visual Studio 2008 project:Microsoft All-In-One Code Framework
For visual studio 2010, here's how to do the C++ side: How to make a dll with C++ Using Explicit PInvoke in C++
Upvotes: 5