Skip to main content

C# - Implementing C# Interfaces in C++ [Beginner]


New technologies are always replacing existing ones. A common transition right now is from C++ to C#. Microsoft helped this transition greatly by creating the managed extensions to C++, which essentially gives us access to all things .NET.

Interfaces are not a language feature of native C++. There are several mechanisms for replicating the functionality, but it's not built in. Interfaces in C#, however, are ingrained directly in the language and are a important construct for any reasonably complicated architecture.

That being said, in order to move forward with new C# code, the C++ is going to have to support interfaces, which is why Microsoft added that feature to C++'s managed extensions.

I'm going to assume you've already got a project you're working with, but for the purposes of this tutorial, I've created a default Visual C++ class library and a C# class library and added both of them to the same solution. Here's a screenshot of my solution explorer in Visual Studio.

Visual Studio Solution
Explorer

Let's start with the C# interface definition. I've created a very basic interface to get us started.
public interface MyInterface
{
  int InterfaceMethodOne();

  string InterfaceMethodTwo();
}
 
In order to expose this interface to the C++ project, we're going to have to add the C# project as a reference. Simply right mouse click on the C++ project and select "References". Once in there select "Add New Reference..." then choose the "Projects" tab and select the C# project.

Project
References

By default, this is what Visual Studio generated when the C++ project was created.
// ManagedCPPApp.h

#pragma once

using namespace System;

namespace ManagedCPPApp {

  public ref class Class1
  {
    // TODO: Add your methods for this class here.
  };
}
 
The changes required to implement the interface are pretty minor.
// ManagedCPPApp.h

#pragma once

using namespace System;

namespace ManagedCPPApp {

  public ref class Class1 : public CSharpLib::MyInterface
  {
  public:
    virtual int InterfaceMethodOne() { return 0; };

    virtual System::String^ InterfaceMethodTwo() {return ""; };
  };
}
 
The first thing you might notice is that this is a ref class. Native C++ classes cannot implement managed interfaces. The syntax to implement the interface is identical to how C++ does inheritance - just stick the name after the colon.

Now you'll need to create definitions for each function in the interface. This is really straight forward, except the virtual keyword is required in the method signature (I can't tell you how many times that stumped me).

I guess the only other oddity is the carat at the end of System::String^. This is simply the managed C++ way of representing a reference. Since in C#, strings are returned by reference, you'll need to represent that in the C++. In my own opinion, I think the managed C++ syntax is really strange.

And that's it. You've implemented a basic interface. Now let's throw something in the interface that's a little more difficult - properties.
public interface MyInterface
{
  float InterfacePropertyOne { get; set; }

  int InterfaceMethodOne();

  string InterfaceMethodTwo();
}
 
Implementing properties in managed C++ is fairly similar to C#. Here's the new C++ implementation of the interface.
public ref class Class1 : public CSharpLib::MyInterface
{
public:
  virtual int InterfaceMethodOne() { return 0; };

  virtual System::String^ InterfaceMethodTwo() {return ""; };

  virtual property float InterfacePropertyOne
  {
    void set(float value) { };
    float get() { return 0; };
  };
};
 
All that's really left now are events. The syntax between C# and C++ for implementing events are nearly identical.
public interface MyInterface
{
  event EventHandler InterfaceEventOne;

  float InterfacePropertyOne { get; set; }

  int InterfaceMethodOne();

  string InterfaceMethodTwo();
}
 
And here's the C++ implementation:
public ref class Class1 : public CSharpLib::MyInterface
{
public:
  virtual event System::EventHandler^ InterfaceEventOne;

  virtual int InterfaceMethodOne() { return 0; };

  virtual System::String^ InterfaceMethodTwo() {return ""; };

  virtual property float InterfacePropertyOne
  {
    void set(float value) { };
    float get() { return 0; };
  };
};
 
There we have it. We've defined an interface in C# that we've implemented in C++. All-in-all the process is not that difficult, it's just a matter of wrapping your head around the crazy syntax in the managed extensions for C++.

Comments

Popular posts from this blog

C# Snippet - Shuffling a Dictionary [Beginner]

Randomizing something can be a daunting task, especially with all the algorithms out there. However, sometimes you just need to shuffle things up, in a simple, yet effective manner. Today we are going to take a quick look at an easy and simple way to randomize a dictionary, which is most likely something that you may be using in a complex application. The tricky thing about ordering dictionaries is that...well they are not ordered to begin with. Typically they are a chaotic collection of key/value pairs. There is no first element or last element, just elements. This is why it is a little tricky to randomize them. Before we get started, we need to build a quick dictionary. For this tutorial, we will be doing an extremely simple string/int dictionary, but rest assured the steps we take can be used for any kind of dictionary you can come up with, no matter what object types you use. Dictionary < String , int > origin = new Dictionary < string , int >();

C# Snippet - The Many Uses Of The Using Keyword [Beginner]

What is the first thing that pops into your mind when you think of the using keyword for C#? Probably those lines that always appear at the top of C# code files - the lines that import types from other namespaces into your code. But while that is the most common use of the using keyword, it is not the only one. Today we are going to take a look at the different uses of the using keyword and what they are useful for. The Using Directive There are two main categories of use for the using keyword - as a "Using Directive" and as a "Using Statement". The lines at the top of a C# file are directives, but that is not the only place they can go. They can also go inside of a namespace block, but they have to be before any other elements declared in the namespace (i.e., you can't add a using statement after a class declaration). Namespace Importing This is by far the most common use of the keyword - it is rare that you see a C# file that does not h

C# WPF Printing Part 2 - Pagination [Intermediate]

About two weeks ago, we had a tutorial here at SOTC on the basics of printing in WPF . It covered the standard stuff, like popping the print dialog, and what you needed to do to print visuals (both created in XAML and on the fly). But really, that's barely scratching the surface - any decent printing system in pretty much any application needs to be able to do a lot more than that. So today, we are going to take one more baby step forward into the world of printing - we are going to take a look at pagination. The main class that we will need to do pagination is the DocumentPaginator . I mentioned this class very briefly in the previous tutorial, but only in the context of the printing methods on PrintDialog , PrintVisual (which we focused on last time) and PrintDocument (which we will be focusing on today). This PrintDocument function takes a DocumentPaginator to print - and this is why we need to create one. Unfortunately, making a DocumentPaginator is not as easy as