tags:

views:

348

answers:

5

How to call managed c# functions from unmanaged c++

A: 

RE: How to call managed C# code from an unmanaged C++ application?

http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.interop/2005-05/msg00030.html

Calling Managed .NET C# COM Objects from Unmanaged C++ Code ...

http://www.codeproject.com/KB/cs/ManagedCOM.aspx

Wrapping a managed C# DLL in a unmanaged C++ project : dll .

http://www.experts-exchange.com/Programming/Languages/.NET/Q_22006727.html

ratty
I followed second link which you have provided and successfully compile the cpp file but failed to run it . It is failing at CreateInstance() using smartpointer..... so iam unable to call functions of c# dll
A: 

Might help Unmanaged to Managed calls (C++ to C#)

Lukas Šalkauskas
+1  A: 

Or use a project of mine that allows C# to create unmanaged exports. Those can be consumed as if they were written in a native language.

Robert Giesecke
+1  A: 

I used COM interop first, but by now I switched to IJW (it just works), as it is a lot simpler. I have a wrapper C++/CLR DLL (compile with /clr).

A simple example (using statics to make the calls easier):

namespace MyClasses       
{
    public class MyClass
    {
        public static void DoSomething()
        {
            MessageBox.Show("Hello World");
        }
    }
}

In the DLL I can reference namespaces as follows:

using namespace MyClasses;

And call it:

__declspec(dllexport) void CallManagedCode()
{
    MyClass::DoSomething();
}

Now you have an unmanaged DLL export "CallManagedCode" which calls into the managed code.

Of course, you also have to convert data between the managed/unmanaged boundary. Starting with VS2008, Microsoft includes a marshal-helper for converting between unmanaged and managed types. See http://msdn.microsoft.com/en-us/library/bb384865.aspx

Daniel Rose
You do not really have to go down that route manually. Check out the link in my reply. It is entirely possible to have the counterpart of DllImport in c#, including all the marshaling goodness that comes with .Net. My MSBuild task adds the appropriate vt-fixups after the build and you do not need to deploy another assembly...
Robert Giesecke
I tried it: The DLL has the exports. However, how am I supposed to use it? I did not find a .lib to allow me to link to the DLL.
Daniel Rose
I don't use C++, but I guess it isn't any different than like you would for any library that doesn't come with C/C++ headers: Write the header for the functions you want to import yourself. As i said, I don#t use C++. It is pretty straightforward from C or Delphi.
Robert Giesecke
The headers isn't the problem. To link to the library you need a .lib, otherwise you'd have to use LoadLibrary() and GetProcAddress() for every call. I "solved" it by manually generating a .def and generating a .lib from that, as in http://support.microsoft.com/kb/131313Also, having a method call itself failed (standard use case when making the call UI-thread-safe). Could I perhaps contact you via email? I didn't find an address anywhere.
Daniel Rose
sure, robert dot giesecke [at] google mail
Robert Giesecke
+1  A: 

I used C++/CLI wrapper classes described here and it was relatively easy to implement.

Simon