Sharing types between unmanaged and managed languages

I have this project split into three parts:
1. Unmanaged C++ doing most of the internal processing
2. C# serving as UI
3. managed C++ bridging the two

Now I want simple types (enums and structs) defined in unmanaged C++ to be visible to C# project. and I don't want to copy-paste. when one definition changes I have to apply the changes to the other. and if I miss something I may not find it out until runtime.

So I came up with the following trick
(see the attached code)

The problem is that in C# I don't see any values in the Command enum. so in C# I cannot do things like
sendCommand(bridge.Command.MOVE_LEFT, ...); // won't compile

Although in managed C++ it compiles fine. (it doesn't show up in intellisense but that is a minor concern)
if (cmd == bridge::Command::MOVE_LEFT) // compiles

Why is the enum empty in C#?
Is there a better way to share types between managed and unmanaged environments without doing too much manual maintenance?
/** 1. define enums and structs in their own header files e.g. **/
enum Command {
    MOVE_LEFT,
    MOVE_RIGHT,
    etc.
};
 
/** 2. include it in both unmanaged and managed projects **/
/// unmanaged_cmd.h
namespace native_proj
{
    #include "Command.h"
}
 
/// managed_cmd.h (managed C++ bridge)
namespace bridge
{
    public
    #include "Command.h"
}
 
// at this point there should be two Command types native_proj::Command and bridge::Command
 
/** 3. use it in C# **/
namespace UI
{
    class derived_form : Form
    {
        void some_method()
        {
            sendCommand(bridge.Command.MOVE_LEFT, input_args, output_results);
        }
    }
}

Open in new window

LVL 9
jhshuklaAsked:
Who is Participating?

Improve company productivity with a Business Account.Sign Up

x
 
jhshuklaConnect With a Mentor Author Commented:
Just found the solution. see http://msdn.microsoft.com/en-us/library/a6cskb49.aspx for explanation

enum header files are now changed to look like
    MOVE_LEFT,
    MOVE_RIGHT,
    etc.

i.e. no enum type names or curly braces

and included like this:

// unmanaged:
namespace native_proj
{
    enum Command {
    #include "Command.h"
    };
}

// managed:
namespace bridge
{
    enum class Command { <<< note the difference "enum class" vs "enum"
    #include "Command.h"
    };
}
0
 
Anurag ThakurTechnical ManagerCommented:
if following is the definition of the enum in the unmanaged c++ file then what will be the access modifier for that enum - as far as i remember it should be equivalent to internal in C# - in that case how can you access the type outside the assembly or interop in your case (i am just guessing as in C# it will not work outside the assembly as it will be given the default access modifier of internal)

enum Command {
    MOVE_LEFT,
    MOVE_RIGHT,
    etc.
};
0
 
jhshuklaAuthor Commented:
that's why I have the following:

/// managed_cmd.h (managed C++ bridge)
namespace bridge
{
    public <<<<<<======== see this
    #include "Command.h"
}
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.