Foozinator
Foozinator

Reputation: 400

C# and C++ class inheritance intermingling

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

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

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

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

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

While assembly 1 could be C++-CLI 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++-CLI 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?

Upvotes: 5

Views: 3207

Answers (3)

Reed Copsey
Reed Copsey

Reputation: 564383

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.

Upvotes: 1

Foozinator
Foozinator

Reputation: 400

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.

Upvotes: 3

Achim
Achim

Reputation: 15702

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.

Upvotes: 4

Related Questions