views:

264

answers:

3

I have an interesting stack of assemblies I want to put together:

  1. Common Assembly (C# or C++)

    public class MyBase
    {
    public void MethodA()
    { ... }
    private void MethodB()
    { ... }
    protected virtual MethodC()
    { ... }
    }
    
  2. Test Code Assemblies (all C++)

    public class MySpecific : public MyBase{
    protected: override MethodC();
    };
    
  3. Test Simulator (C#)

    MySpecific obj = new MySpecific();
    obj.MethodC();
    

While assembly 1 could be C++ to keep things simpler, I'd really like to keep assembly 3 in C#. This is largely an exercise to see if inheritance could be done in either direction, but I also have a real-world case where this stack is useful.

The first problem I find is that the C++ assembly does not compile because it doesn't recognize MyBase as a class, even though I have a reference to assembly 1 and what looks like the proper namespace.

How do I write classes that are language-portable?

A: 

This will work fine, but you'll need to use the C++/CLI syntax, if you're working with managed types (ie: inheriting from a C# class). So, in this case, the item in 2. should look more like:

public ref class MySpecific : public MyBase { ... }

Make sure that file is compiled with /clr are well.

Here is a tutorial describing inheritance in C++/CLI.

Reed Copsey
How can I get the C++ compiler to see MyBase? I keep getting "C2504: 'Mybase' : base class undefined"
Foozinator
Make sure it's added as a reference, and that you have this file compiled with /clr. Also, make sure you're working with (or using) the appropriate namespaces. It sounds like you're not in a section using the same namespace. You could fully qualify MyBase - ie: public ref class MySpecific : public MyNamespace::MyBase { ... }
Reed Copsey
+3  A: 

I think you have to declare MySpecific as a managed class like this:

public ref class MySpecific : public MyBase { ... }

See the CLI/C++ documentation for details. You will not be able to use old C++ code without modifications, but I think everything you have in mind should be possible.

Achim
A: 

Found the answer:

`#using "..\common\bin\debug\common.dll"`

That, in addition to the /clr switch (the c++ side needs to be mananged) seems to be working, so far.

Foozinator