tags:

views:

112

answers:

2

I need to expose some C++ classes to C# (I am building on Linux, using mono, so COM is not an option)

The evidence I have gathered so far suggests that the best way to approach this is:

  1. Write a wrapper C++.Net class around the ISO C++ class
  2. Consume the C++.Net classes from C#

I have the following questions:

  • First, is this the "best" way of achieving the goal of exposing ISO C++ classes to C# ?
  • So far though, I have not seen any examples that actually show how to do this - can anyone suggest some links, or a code snippet to show how this is done for a dummy class?
  • How may I send asynchronous message notifications from the C++ code to the C# code ?. Ideally, I would like to cause the C# class to raise an event, with the received data as an argument
+5  A: 

You can't do C++/.NET classes on Linux using Mono. Mono doesn't support Managed C++ or C++/CLI, so there is no way to "Write a wrapper C++.Net class around the ISO C++ class".

Your best option for this is to generate a C API for your C++ class, which can be accessed via Platform Invoke.

That being said, one option for easing this is to use SWIG to generate the wrappers for you. It supports generation of C# wrappers from C++ classes (as well as wrappers to other languages), and works well on Linux/Mono.


Edit:

For an offical "Mono doesn't support mixed mode C++/CLI", see the Languages page:

It's important to note that any language that compiles to pure IL should work under Mono. Some languages such as Microsoft's Managed C++ do not always compile to pure IL, so they will not always work as expected, since they are not truly platform independent.

C++/CLI for native interop requires non-pure IL, so it will not work on Mono.

Reed Copsey
@Reed: are you sure about not being able to use C++/.Net? Could you send me the link please - I need to show it to someone who insists that it is possible
Stick it to THE MAN
@Stick it to THE MAN: Here's a SO answer from a Mono dev: http://stackoverflow.com/questions/183377/does-mono-net-support-and-compile-c-cli I'll see if I can find a more "offical" source, but it isn't supported.
Reed Copsey
@Stick it to THE MAN: I edited my answer to show you more details - Mono's language page discusses this, right at the top.
Reed Copsey
@Reed: Thank you, thank you, thank you!. You probaly saved me a whole lot of grief going down that path. ok, I'm off to swot over the SWIG and P/Invoke documentation (but not before I have accepted your answer!)
Stick it to THE MAN
A: 

you had to write a c++ managed wraper around your iso c++ class like this

 public ref class MyWrapper
    {
    public:
    MyWrapper (void)
    {
    pObj = new CMyUnmanagedClass();
    }
    ~MyWrapper (void)
    {
    delete pObj;
    }
    int foo(void)
    {
    //pass through to the unmanaged object
    return pObj->foo();
    }
    private:
    CMyUnmanagedClass* pObj;
    };

i hope this help regards

Sebastian Marcet
This does not work on Linux/Mono. There is no support for mixed mode assemblies (or C++/CLI at all) with Mono.
Reed Copsey