之前看见园子里一篇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. postman测试接口时的参数对应接口的两种情况

    第一种通过json字符串的情况去进行测试,最终将json字符串转成对应的对象 代码里面一定要加上@RequestBody注解,即使是一个字符串也需要加这个注解 第二种通过key-value的形式去加入 ...

  2. #min-max容斥,FWT#洛谷 3175 [HAOI2015]按位或

    题目 分析 按位去看,最终的答案要求 \(E(\max S)\) 就是 \(S\) 出现的期望时间. 根据min-max容斥,\(E(\max S)=\sum_{T\subset S}(-1)^{|T ...

  3. 第二十一篇:信号、缓存、中间件、Form操作

    一.CSRF 二.中间件 三.缓存 四.信号 五.Form操作

  4. 将 Github Pages 个人博客录入搜索引擎(以 Bing 为例)

    目录 关于 Bing Webmaster Tools 步骤一:登录 步骤二:添加网站 步骤三:验证网站 步骤四:添加网站地图 验证 & 总结 相关链接 笔者最近准备将 Gitee Pages ...

  5. scala json解析到case类

    有时候,需要将从json文件读取程序配置设置,并同步到定义好的一些case类中,这个时候可以使用 io.circe解析json文件,并同步文件字段到定义好的case类 case class Confi ...

  6. ES6~ES9

    ES6 1. let 1.1 let 变量声明及声明特性 let 用来声明变量,具有以下特性: 一.相较于 var ,let 变量不能重复声明 let a = 'a'; let a = 'a'; // ...

  7. SpringCloud整体架构概览

    什么是SpringCloud #目标 协调任何服务,简化分布式系统开发. #简介 构建分布式系统不应该是复杂的,SpringCloud对常见的分布式系统模式提供了简单易用的编程模型,帮助开发者构建弹性 ...

  8. MRBS(Meeting Room Booking System)开源的会议室预订系统搭建使用

    前一家公司所有的办公系统都是自己开发的,包括排班.工单.会议室预定等等,很方便. 目前所在的公司,每周部门例会找行政预订了会议室,但多次去都被人占了,很烦,于是网上找了一个评价不错的系统,python ...

  9. Webpack Proxy工作原理?为什么能解决跨域?

    一.是什么 webpack proxy,即webpack提供的代理服务 基本行为就是接收客户端发送的请求后转发给其他服务器 其目的是为了便于开发者在开发模式下解决跨域问题(浏览器安全策略限制) 想要实 ...

  10. kolla-ansible部署OpenStack Train版技术方案

    简单架构示意 项目目标 1. 实现容器化部署docker+ Ansible+openstack-tarin 2. 使用keeplived监控nova服务实现在单台服务器宕机的情况下能迅速切断连接减轻平 ...