UE4 C++调用C# DLL(DllExport方法)
之前看见园子里一篇C++调用C#的文章,参考后拿UE试一下。刚开始尝试了C# dll > CLR C++ DLL > Native C++ DLL的做法,
原生环境下是可以的,但是到UE4里会Crash。
后来换成了Dll Export(UnmanagedExports)的做法,并测试成功。
当然对比UnrealCLR之类的方案,这个只能解一时之需。
1.注意事项
使用Nuget上的UnmanagedExports1.2.7版本,各种坑点和问题总结如下:
- .NetFramwork dll从4.5-4.8应该都是可以导出的,.Net standard(core)的dll导出测试失败。
- 必须指定导出平台是x86还是x64,不要用默认Any导出,否则失败。
- [DllExport("FuncName")]属性上必须指定方法名称,不指定名称虽然不报错,但导出仍有问题。
- 可以用dependencywalker工具检查有没有导出成功,能用ILSpy之类的工具打开也并不代表不能用,非托管信息是额外加的。
- 中文操作系统build可能会报错。
2.使用流程
第一步先创建一个.NetFramework的dll工程,然后去Nuget下载插件UnmanagedExports

第二步修改发布平台为x64。
然后编写测试代码,注意只能是静态方法:
namespace ClassLibrary2
{
public class Class1
{
[DllExport("InvokeFuncPtr")]
public static void InvokeFuncPtr(Action arg)
{
arg();
}
}
}
参数是函数指针也是可以的。
第三步,UE C++部分,.h文件里先定义函数指针签名
测试类.h文件:
typedef void(*pTypeMyAction)();
typedef int32(*pTypeInvokeFuncPtr)(pTypeMyAction Arg);
测试类.cpp文件:
FString filePath = FString("ClassLibrary2.dll");//Dll位置
if (FPaths::FileExists(filePath))
{
void* DLLHandle;
DLLHandle = FPlatformProcess::GetDllHandle(*filePath);
if (DLLHandle != NULL)
{
pTypeInvokeFuncPtr DLLgetAdd = NULL;
DLLgetAdd = (pTypeInvokeFuncPtr)FPlatformProcess::GetDllExport(DLLHandle, *FString("InvokeFuncPtr"));
if (DLLgetAdd != NULL)
{
DLLgetAdd([]() {
UE_LOG(LogTemp, Log, TEXT("Dll load successful!"));
});//调用处
}
FPlatformProcess::FreeDllHandle(DLLHandle);//释放处
}
}
最终打印Log,调用成功:

更多可参考github:https://github.com/3F/DllExport (好像不是一个作者,但是接口对得上)
包括传结构体等做法也可以在github页面上找到。
UE4 C++调用C# DLL(DllExport方法)的更多相关文章
- go 调用windows dll 的方法
go 调用windows dll 的方法 ,代码如下: package main import ( "fmt" "syscall" "time&quo ...
- IronPython调用C# DLL函数方法
C# DLL源码 using System; using System.Collections.Generic; using System.Text; using System.Security.Cr ...
- Java Tomcat 中调用.net DLL的方法
近日一个java的项目,客户要求项目中必须使用其提供的加密机制,扔给了两个.net写的DLL.网络上搜了一圈也没找到啥东西,甚至看到人扬言此事绝无可能.郁闷当中考虑了一个思路.用C#做一个Com,调用 ...
- java调用C++ DLL库方法
最近一个项目要开发网页端人脸识别项目,人脸识别的算法已经写好,是C++版,但是网页端要求使用Java后台,这就涉及到Java调用DLL的问题.经过查找,实现了一个简单的例子. 1.第一步,先在Java ...
- 关于C#动态调用VC Dll的方法(转)
http://blog.csdn.net/null1/article/details/3953155
- unity调用c++ dll方法介绍
摘要 unity用的很普遍,现在很多代码还是用c++写的,需要用unity去调用c++的代码.这里介绍了一种unity调用c++ dll的方法,希望有所帮助. 我采用的软件是Visual Studio ...
- C# 调用外部dll(转)
C# 调用外部dll 一. DLL与应用程序 动态链接库(也称为DLL,即为"Dynamic Link Library"的缩写)是Microsoft Windows最 ...
- C#调用外部DLL介绍及使用详解
一. DLL与应用程序 动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一,打开Windows系统文件 ...
- C#调用C++ Dll
现在项目基本都是旁边C++的哥们做好dll扔给我,然后我调用.好久之前晚上down了一份c#调用c++dll的方法,出处早已经遗忘.闲来无事,放上来好了.原作者看到后可以留言,我会把您链接放上的,帮了 ...
- VS2012 C#调用C++ dll
VS2012 C#调用C++ dll 调试方法:[dll工程和调用dll的exe工程在同一个解决方案中]dll工程,属性-配置属性-调试-把 命令 为 调用该dll的exe工程的bin\Debug\* ...
随机推荐
- 学习Source Generators之从swagger中生成类
前面学习了一些Source Generators的基础只是,接下来就来实践一下,用这个来生成我们所需要的代码. 本文将通过读取swagger.json的内容,解析并生成对应的请求响应类的代码. 创建项 ...
- iNeuOS工业互联网操作系统,“低代码”表单开发应用过程(一)
iNeuOS工业互联网操作系统,"低代码"表单开发应用过程(一) 目 录 1. 概述... 2 2. "低代码"表单开发应用过程 ...
- #矩阵乘法,斐波那契#洛谷 2544 [AHOI2004] 数字迷阵
题目 分析 oeis找规律得到第一列和第二列的通项公式,然后矩阵乘法 代码 #include <cstdio> #include <cctype> #include <c ...
- XML文档节点导航与选择指南
XPath(XML Path Language)是XSLT标准的主要组成部分.它用于在XML文档中浏览元素和属性,提供了一种强大的定位和选择节点的方式. XPath的基本特点 代表XML路径语言: X ...
- C++ 解引用与函数基础:内存地址、调用方法及声明
C++ 解引用 获取内存地址和值 在上一页的示例中,我们使用了指针变量来获取变量的内存地址(与引用运算符 & 一起使用).但是,你也可以使用指针来获取变量的值,这可以通过使用 * 运算符(解引 ...
- 【进阶篇】Java 实际开发中积累的几个小技巧(二)
目录 前言 六.自定义注解 6.1定义注解 6.2切面实现 6.3业务使用 七.抽象类和接口 7.1隔离业务层与 ORM 层 7.2隔离子系统的业务实现 7.3选择对比 文章小结 前言 笔者目前从事一 ...
- 远程主机可能不符合glibc和libstdc++ VS Code服务器的先决条件
报错信息 VSCode无法连接远程服务器,终端一直提醒: [22:46:01.906] > Waiting for server log... [22:46:01.936] > Waiti ...
- Web前端 - Vue
<!-- id标识vue作用的范围 --> <div id="app"> <!-- {{}} 插值表达式,绑定vue中的data数据 --> { ...
- iNeuOS工业互联网操作系统,民爆远程运维平台案例
iNeuOS工业互联网操作系统,民爆远程运维平台案例 目 录 1. 概述... 2 2. iNeuOS在民爆生产厂区和北京运维中心配置... 3 1.1 ...
- eclipse 卡顿的优化办法
1. 关闭校验 2. 关闭插件自动升级 3.关闭界面设置的一些选项