提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
由于本人最近需要用C#给UE开发一个功能,所以想到了C++调用C#库函数的方法,查阅了CSDN和虚幻官方论坛等很多资料,遇到了很多坑,分享下经历同时作为笔记。
一、准备工作
由于网上很多教程和资料都已经过时导致很多方式方法并不适合目前的虚幻4.26版本。
1.C#使用什么目标框架构建?
答案是:.Net Framework 4 【当然也许虚幻c++用的Api不一样需要的C#目标框架也不同,也许随着时间推移虚幻可以支持更高版本,C++代码会正在后面贴出】。
提示:本节以下踩坑记录
看到官方的一篇文绉绉 说对Net Core3.1长期支持 作为这篇文章开发C#服务器相关的目标框架。因此我尝试了
我在C++内调用时候遇到无法加载dll的提示。里面有句话就是说框架应该是.Net Framework 4
2.需要什么工具让C++访问C#编译的dll?
答案是:UnmanagedExport 功能是将托管函数导出让C++调用
如图所示来搜索安装。【下图其他版本试了几次,反而无法调用,也许是我没用对】
如果搜索没有本文件可以通过
https://www.nuget.org/packages/UnmanagedExports
下载
3.还需要准备啥
答案是:请务必使用x64 因为虚幻是需要这样的。
二、C#编程dll库文件
1.UnmanagedExport 使用需要注意的
①它编译完后是类似于C++的结构需要2个方法代替1个方法,可能描述不太好,还是看图吧。
②需要1个 void 开头的空方法,后来这个是非必须我也没测试了。
https://forums.unrealengine.com/t/is-it-possible-to-call-a-managed-net-dll-from-ue4-c-project/281570/4
这是官方论坛上老外的提示,截图是网页自动翻译的。
③不建议使用[DllExport] 无参数的,虽然插件里提示可以使用,但是1个dll里面只能用11个否则就会出错,出现的错误好像和。
C++内调试到执行方法返回参数时候会报以下错误,好像和使用其他目标框架报的错误类似。
提示:本节以下踩坑记录
由于没明白他的机制,还以为是它编译错乱
奇葩图1:
奇葩图2:以为只写[DllExport] 就不会出现了
奇葩图3:调用结果【至少是能调用了这图算是我1天半的成果了】
以为使用了升级版本旧可以避免这个错误了
然而在使用本侧率升级框架到4.6.2 以及UnmanagedExport 升级到第三个版本发现到了C++还是无法调用,所报的错误和目标框架不符合相同的错误。
2.C#测试代码
代码如下(示例):
namespace Frame4Ue4ForCq888
{
public class dlltest
{
//必须要有空方法
static public void AFunction()
{
CCC();
}
//[DllExport]默认无参数的1个dll只能由1个所以我这里全用的是带有方法名称标签的
[DllExport("GetStrb", CallingConvention = CallingConvention.Winapi)]
static public string GetStrb()
{
return GetStrbb();
}
//类似C++ .h 和.cpp文件的2个方法
[DllExport("GetStrb", CallingConvention = CallingConvention.Winapi)]
static public string GetStrbb()
{
string str = "bb";
return str;
}
[DllExport("GetInt", CallingConvention = CallingConvention.Winapi)]
static public int GetInt(