How to write C# plugin

(This tuto was possible with the help of those projects:…s/linking-dlls)

First, open a project and create a Blueprint Function Library C++ class:

Click Next and Create Class and visual studio should open, else double click on the class inside the engine.

Copy this into MyBlueprintFunctionLibrary.h :

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "MyBlueprintFunctionLibrary.generated.h"

class VIRTUALREALITY_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary


UFUNCTION(BlueprintCallable, Category = "MyLibrary")
static void ImportDLL();

UFUNCTION(BlueprintCallable, Category = "MyLibrary")
static int Add(int x, int y);

Copy this into MyBlueprintFunctionLibrary.cpp :

// Fill out your copyright notice in the Description page of Project Settings.

#include "MyBlueprintFunctionLibrary.h"

typedef int(*_Add)(int x, int y);

void* v_dllHandle;
_Add m_Add;

void UMyBlueprintFunctionLibrary::ImportDLL()
FString filePath = "E:/CsPlugin.dll";
FString procA = "Add";

v_dllHandle = FPlatformProcess::GetDllHandle(*filePath);
m_Add = (_Add)FPlatformProcess::GetDllExport(v_dllHandle, *procA);

int UMyBlueprintFunctionLibrary::Add(int x, int y)
int out = m_Add(x, y);

return out;

And build this plugin (do it again if you have error):

Then download this visual project that include a C# demo that will create a dll to be used by the class we created in Unreal.

Open the project, build it with the same platform you use to compile your Unreal class (x86 or x64) then grab the DLL built and move it to a path sharing the same path as filePath in MyBlueprintFunctionLibrary.cpp

Now, open a blueprint, right click and now you can call Add() from your Unreal plugin that come from a C# plugin.

csK0GFD - Imgur.png

Enjoy C# dev on Unreal Engine :slight_smile:

Now this is interesting. I had been wondering how this was done for a minute now. Still painfully new to writing code… This helps though since Most of my experience has actually been with C# I also have some old code I want to use without completely re-writing all over since it’s just stuff I wanted to experiment with anyhow. Maybe now I can move some of that stuff over into the engine and play around :slight_smile: