How to combine C++ and C# in Visual Studio?

Joined
1/7/09
Messages
21
Points
11
Hey guys,

Recently I'm working on a project to model some trading strategies. I have already done the computational part in C++, but obviously I don't want the user interface to be only command lines so that I'm trying to build a user-friendly interface in C# and then I could combine these two...

But I really don't know how to do these altho I have googled many thread/websites.. Most say that you could package your C++ code into a dll(I don't know how to do it!) and then I could integrate it into my C# part??

Could anyone give me more specific instructions/advices on how could I achieve so?... Don't know if I have explained my question comprehensively...

Thanks!
 
You don't find many google result for this because not many people do want to combine C++/C#
Your choices would be to make wrap the C++ in dll and use Excel as your interface. In all likelihood, Excel UI would suffice for your need. A lot of trading desks this use combination.
The other choice would be to rewrite your C++ computational part into C#. It's trivial and take little time. I've done that and for the most part, it's verbatim. Then use the oodle of visual tool, third party addin, component to let your imagination fly.
 
It's easy.

First you have to build your C++ project into a dll (it does not contain main() ). The easiest would be to create a new C++ project as Class Library, copy/paste your code and edit it so you should have only your data and calculations but remove main() and any input/output functions.

Then in the same solution create another project but C# as Windows Forms Application, create the forms and controls where you want to output your data, include you C++ file, create your C++ objects (your data structures are classes?) and consume the data by controls. You have to read msdn about details. But it will work, C# will consume your non-managed C++ data flawlessly.
 
Thanks const451..! Now my only question is, how to transform my classes into dll?... =D>



It's easy.

First you have to build your C++ project into a dll (it does not contain main() ). The easiest would be to create a new C++ project as Class Library, copy/paste your code and edit it so you should have only your data and calculations but remove main() and any input/output functions.

Then in the same solution create another project but C# as Windows Forms Application, create the forms and controls where you want to output your data, include you C++ file, create your C++ objects (your data structures are classes?) and consume the data by controls. You have to read msdn about details. But it will work, C# will consume your non-managed C++ data flawlessly.
 
Andy,

Thank you very much for your help! Now I think the only question for me is how to wrap it into dll, which I still don't know yet...

Btw, I m using VS Express 2008.
 
And if you build your user interface in C# instead of using Excel then you do not need COM Interop. You just reference your C++ classes from C# code - it is much easier. - Just giving you the option.
To pack your C++ classes into dll you create new C++ project (in your existing solution) as Class Library, so if you build this project it will build into dll instead of exe. Then you just port your classes into this new project.
 
There are multiple ways to combine C# and C++.

1] Compile C++ code into DLL. Then you invoke C++ code from C# in the same way as invoke DLL function in VB/VBA (check out the import attribute in C#)

2] Compile C++ code into a COM. Then you can use this component as if it is written natively in C# (i.e. reference directly)

3] Hybrid mode

Both of the [1] and [2] are executable level integration. You can also do source code level integration using [3]. It gives your much more flexibility, but at the same a bit more involved too. Google sth like "Managed / Unmanaged Hybrid", C++ Hybrid", you may get some instruction. Alternatively, chapter 4 of this book is dedicated to this topic.
 
BTW, combining C# and C++ is actually quite useful and very relevant in front office, both in Excel integration and beyond. Many analytic libraries are written in C++. With a C# wrapper, you can no only expose the logic to a nice front end (Excel, WinForm alike), but also instantly add more powers to your C++ code. For example, many "legacy" C++ library are not really multi-threaded, let alone distributed. By adding a C# wrap, you can easily make it "multi-thread", parallel-able, even distributed with much less efforts and risk than to modify the C++ code directly.
 
thanks Zhou Xing!

BTW, combining C# and C++ is actually quite useful and very relevant in front office, both in Excel integration and beyond. Many analytic libraries are written in C++. With a C# wrapper, you can no only expose the logic to a nice front end (Excel, WinForm alike), but also instantly add more powers to your C++ code. For example, many "legacy" C++ library are not really multi-threaded, let alone distributed. By adding a C# wrap, you can easily make it "multi-thread", parallel-able, even distributed with much less efforts and risk than to modify the C++ code directly.
 
With XLW you can write hybrid C++/C# XLLs. That is, you can write some function in C++ and others in C# all in the same XLL. For your user using your XLL in Excel there is no way of telling in what language the function is written. Its useful for example when you want to write compute extensive functions (like MC pricing) in C++ but want to implement other 'worldly' functions ( e.g retrive market data) in C#
Also you can for example initially implement a function in C# and then if need be re-implement in C++ without affecting the user.
 
There are a few ways to do this.

1) Wrap the C++ code in C style dll's and then use PInvoke to import the dll's. Documentation for doing this on MSDN can be found at http://msdn.microsoft.com/en-us/library/aa288468(VS.71).aspx.

2) You can wrap the C++ code in COM and then create a managed wrapper around it that can be accessed from C#. I hate that option so much that I won't provide an example of how to do it. I highly recommend against that route unless you absolutely have to go there.

3) Create a Managed C++ project and wrap the C++ code with managed code. I like this option. Documentation for this can be found on MSDN at http://msdn.microsoft.com/en-us/library/b23b94s7(VS.100).aspx.
 
Another scenario ..

Here is now the Excel Addin using C# instead of ATL. It is much easier because of the uniformity of code when compared to ATL code in C++. So we can choose.


We decided to convert this example into an Excel COM add-in. Making it as COM add-in has as advantage that it runs inside Excel and thus can create the Excel sheet much faster as there are no out-of-process calls needed anymore. And the COM add-in still has the advantage that you can use fast C++ code.

Instead of making the COM add-in in C++/ATL, we decided to make the COM add-in in C# using the "Shared Add-in" project wizard. Creating a COM add-in in C++ is difficult and error-prone. Using the C# "Shared Add-in" project wizard is much easier.

The wizard generates a Connect class that implements the IExtensibility2 interface required for COM add-ins. The setup project that is also generated by the wizard, handles registering the add-in in the registry.
In the OnConnection() method of the generated Connect class, we add code to create a menu item that calls our callback function (In .NET this is handled by a delegate). In the OnDisconnection() method we add code that removes the menu item we created in the OnConnection() method. The menu item is in Excel 2007 available in the "Add-In" ribbon menu.



Excel Addin
 
There are a few ways to do this.

1) Wrap the C++ code in C style dll's and then use PInvoke to import the dll's. Documentation for doing this on MSDN can be found at http://msdn.microsoft.com/en-us/library/aa288468(VS.71).aspx.

2) You can wrap the C++ code in COM and then create a managed wrapper around it that can be accessed from C#. I hate that option so much that I won't provide an example of how to do it. I highly recommend against that route unless you absolutely have to go there.

3) Create a Managed C++ project and wrap the C++ code with managed code. I like this option. Documentation for this can be found on MSDN at http://msdn.microsoft.com/en-us/library/b23b94s7(VS.100).aspx.


I've looked into this same exact problem a few months ago. These suggestions are good ideas.

Personally, I would avoid COM because I think it ancient technology that should not be perpetuated in 2009. PInvoke is kind of kludgy but its incredibly easy and fast to test, assuming your code is already a C++ DLL. You should be able to call PInvoke with a few lines of code in C#. .NET does a lot of the conversions for you.

Managed wrappers are a pain as you will need to jacket every unmanaged call in your library with a managed one. If its just function calls, C-style, this is no big deal. If its code with classes that return back objects that need to be passed in as parameters to other method calls, you will need to rearchitect your API. Also, PInvoke is slooooow. If you are calling this function inside a Monte-Carlo simulation for each scenario you are going to get killed.

There is also some interfaces developed by MS. There are two Apress books: one on C++/CLI and the other on .NET 3.5. I forget which book has which but one of them covers the older interface and the other covers the new interface. I would go to your local Barnes and Nobles and browse both books.
 
Hi guys,
i have a C++ code with no classes ..(but with Functions)
It travels through the Directory and stores the name of the Files in Sql DB...(i have defined Functions to do it)
so what should i exactly do in order to converet my c++ code (or .exe ) file into a dll...
or Is there any way where i could use the Db Directly in c# ?
basically i want to dispaly those Records in tree Format ..
so i was told it is very much using c# ??
iam totally new to these concepts...

can somebody Give me a solid lead on what i should do next ??(How to proceed )
should i convert my code such that all the functions comes Under corresponding classes ??

sorry if my Question is Dumb ..
hope i have Conveyed Sufficient Information !
 
Back
Top Bottom