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# 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...

C# WPF Tutorial - Implementing IScrollInfo [Advanced]

The ScrollViewer in WPF is pretty handy (and quite flexible) - especially when compared to what you had to work with in WinForms ( ScrollableControl ). 98% of the time, I can make the ScrollViewer do what I need it to for the given situation. Those other 2 percent, though, can get kind of hairy. Fortunately, WPF provides the IScrollInfo interface - which is what we will be talking about today. So what is IScrollInfo ? Well, it is a way to take over the logic behind scrolling, while still maintaining the look and feel of the standard ScrollViewer . Now, first off, why in the world would we want to do that? To answer that question, I'm going to take a an example from a tutorial that is over a year old now - Creating a Custom Panel Control . In that tutorial, we created our own custom WPF panel (that animated!). One of the issues with that panel though (and the WPF WrapPanel in general) is that you have to disable the horizontal scrollbar if you put the panel in a ScrollV...