之前看见园子里一篇C++调用C#的文章,参考后拿UE试一下。刚开始尝试了C# dll > CLR C++ DLL > Native C++ DLL的做法,

原生环境下是可以的,但是到UE4里会Crash。

后来换成了Dll Export(UnmanagedExports)的做法,并测试成功。

当然对比UnrealCLR之类的方案,这个只能解一时之需。

1.注意事项

使用Nuget上的UnmanagedExports1.2.7版本,各种坑点和问题总结如下:

  1. .NetFramwork dll从4.5-4.8应该都是可以导出的,.Net standard(core)的dll导出测试失败。
  2. 必须指定导出平台是x86还是x64,不要用默认Any导出,否则失败。
  3. [DllExport("FuncName")]属性上必须指定方法名称,不指定名称虽然不报错,但导出仍有问题。
  4. 可以用dependencywalker工具检查有没有导出成功,能用ILSpy之类的工具打开也并不代表不能用,非托管信息是额外加的。
  5. 中文操作系统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方法)的更多相关文章

  1. go 调用windows dll 的方法

    go 调用windows dll 的方法 ,代码如下: package main import ( "fmt" "syscall" "time&quo ...

  2. IronPython调用C# DLL函数方法

    C# DLL源码 using System; using System.Collections.Generic; using System.Text; using System.Security.Cr ...

  3. Java Tomcat 中调用.net DLL的方法

    近日一个java的项目,客户要求项目中必须使用其提供的加密机制,扔给了两个.net写的DLL.网络上搜了一圈也没找到啥东西,甚至看到人扬言此事绝无可能.郁闷当中考虑了一个思路.用C#做一个Com,调用 ...

  4. java调用C++ DLL库方法

    最近一个项目要开发网页端人脸识别项目,人脸识别的算法已经写好,是C++版,但是网页端要求使用Java后台,这就涉及到Java调用DLL的问题.经过查找,实现了一个简单的例子. 1.第一步,先在Java ...

  5. 关于C#动态调用VC Dll的方法(转)

    http://blog.csdn.net/null1/article/details/3953155

  6. unity调用c++ dll方法介绍

    摘要 unity用的很普遍,现在很多代码还是用c++写的,需要用unity去调用c++的代码.这里介绍了一种unity调用c++ dll的方法,希望有所帮助. 我采用的软件是Visual Studio ...

  7. C# 调用外部dll(转)

    C# 调用外部dll   一.      DLL与应用程序 动态链接库(也称为DLL,即为"Dynamic Link Library"的缩写)是Microsoft Windows最 ...

  8. C#调用外部DLL介绍及使用详解

    一.      DLL与应用程序 动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一,打开Windows系统文件 ...

  9. C#调用C++ Dll

    现在项目基本都是旁边C++的哥们做好dll扔给我,然后我调用.好久之前晚上down了一份c#调用c++dll的方法,出处早已经遗忘.闲来无事,放上来好了.原作者看到后可以留言,我会把您链接放上的,帮了 ...

  10.  VS2012 C#调用C++ dll

    VS2012 C#调用C++ dll 调试方法:[dll工程和调用dll的exe工程在同一个解决方案中]dll工程,属性-配置属性-调试-把 命令 为 调用该dll的exe工程的bin\Debug\* ...

随机推荐

  1. #双指针#洛谷 7405 [JOI 2021 Final] 雪玉

    题目传送门 分析 无论怎样刮风,雪球的相对位置不会改变, 实际上每一个空段都由左右两个雪球瓜分(边界空段除外), 那么按照空段长度从小到大排序,用双指针找到恰好第一个未瓜分的位置 代码 #includ ...

  2. #并查集,单调栈#美团2018年CodeM大赛-决赛 C-Traffic

    题目 分析 首先如果枚举起点\(i\),点\(i\)到点\(j\)(i<j)的距离跳到点\(k\)(k<i)一定不优,所以可以先处理这种情况, 用单调栈维护\(dp\)单调递增,并且如果栈 ...

  3. 面试官:Redis如何实现延迟任务?

    延迟任务(Delayed Task)是指在未来的某个时间点,执行相应的任务.也就是说,延迟任务是一种计划任务,它被安排在特定的时间后执行,而不是立即执行. 延迟任务的常见使用场景有以下几个: 定时发送 ...

  4. openGauss中如何管理表空间

    openGauss 中如何管理表空间 在 openGauss 中,表空间是一个目录,在物理数据和逻辑数据间提供了抽象的一层,为所有的数据库对象分配存储空间,里面存储的是它所包含的数据库的各种物理文件. ...

  5. 建议收藏!Harmony应用配置文件概述(Stage模型)

    一. 应用配置文件 每个应用项目必须在项目的代码目录下加入配置文件,这些配置文件会向编译工具.操作系统和应用市场提供应用的基本信息. 在基于Stage模型开发的应用项目代码下,都存在一个app.jso ...

  6. centos8 \CentOS 9 Stream rpm 安装mysql8.0.28

    centos8 rpm 安装mysql8.0.28 检查 检测系统是否自带安装 MySQL 命令如下: rpm -qa | grep mysql 如果如下存在已安装的包,就需要卸载 mysql80-c ...

  7. lin-view-ui Vue 2.0 组件库

    lin-view-ui 是一款基于 Vue.js 2.0 的前端 UI 组件库,主要集成了平时在开发中使用到的 UI 组件. 特性 基于 Vue 开发的 UI 组件 使用 npm + webpack ...

  8. 【c++】类valarray介绍

    valarray类用于处理数组中的数值,如将所有元素相加,找出最大.最小值,数组长度. 如何使用valarray类: 1.首先需要声明头文件        #include<valarray&g ...

  9. 力扣1112(MySQL)-每位学生的最高成绩(中等)

    题目: 表:Enrollments (student_id, course_id) 是该表的主键. 问题编写一个 SQL 查询,查询每位学生获得的最高成绩和它所对应的科目,若科目成绩并列,取 cour ...

  10. 力扣21(java&python)-合并两个有序链表(简单)

    题目: 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例 1: 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3 ...