Unity——在C#中调用C++动态链接库(DLL)

这篇具有很好参考价值的文章主要介绍了Unity——在C#中调用C++动态链接库(DLL)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、创建C++动态链接库(DLL)

1、新建C++空项目

打开VS,新建一个C++空项目,自命名项目名称与位置。

Unity——在C#中调用C++动态链接库(DLL)

Unity——在C#中调用C++动态链接库(DLL)

2、配置项目属性为动态链接库

右键项目,点击属性,打开项目属性页,将常规中的配置类型改为动态库(.dll)。

Unity——在C#中调用C++动态链接库(DLL)

 3、添加.h头文件

右键头文件,点击添加—>新建项,选择头文件.h,命名为DllForUnity.h,点击添加。

Unity——在C#中调用C++动态链接库(DLL)

代码如下: 

#pragma once
#include<math.h>
#include<string.h>
#include<iostream>
#define _DllExport _declspec(dllexport) //使用宏定义缩写下
 
 
extern "C"
{
   float _DllExport GetDistance(float x1, float y1, float x2, float y2);
}

4、添加.cpp文件

右键源文件,点击添加—>新建项,选择C++文件.cpp,命名为DllForUnity.h,点击添加。

Unity——在C#中调用C++动态链接库(DLL)

代码如下: 

#include <DllForUnity.h>

float GetDistance(float x1, float y1, float x2, float y2)
{
    return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

5、设置编译为C++代码

右击项目,点击属性,对C/C++下面的高级中的编译为选择“编译为C++代码(/TP)”。

Unity——在C#中调用C++动态链接库(DLL)

6、生成解决方案

点击生成->生成解决方案,生成之后,会显示出生成成功。

Unity——在C#中调用C++动态链接库(DLL)

7、确定生成.dll文件

在项目路径下x64文件夹的Debug中就可以看到生成的.dll文件

Unity——在C#中调用C++动态链接库(DLL)

二、将Dll库在Unity工程中调用

1、创建Unity工程

打开Unity创建新项目,添加两个Cube,分别命名为Cube1、Cube2,添加一个空物体命名为Main。

Unity——在C#中调用C++动态链接库(DLL)

2、将Dll文件放入Unity项目中

在项目下的Assets文件夹下新建一个文件夹命名为Plugins,将之前生成的动态链接库放到Plugins文件夹下

Unity——在C#中调用C++动态链接库(DLL)

3、新建脚本调用C++代码

新建Main.cs脚本,并把脚本挂载在Main的空物体下。

Unity——在C#中调用C++动态链接库(DLL)

代码如下:

using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;

public class Main : MonoBehaviour
{
    private GameObject cube1;
    private GameObject cube2;
    // Use this for initialization
    void Start()
    {
        cube1 = GameObject.Find("Cube1");
        cube2 = GameObject.Find("Cube2");
        PrintDistanceViaUnity();
    }

    [DllImport("CppAndCS.dll")]
    public static extern float GetDistance(float x1, float y1, float x2, float y2);

    void PrintDistanceViaUnity()
    {
        var pos1 = cube1.transform.position;
        var pos2 = cube2.transform.position;
        Debug.Log("Distance of Two Cube");
        Debug.Log("Distance:" + GetDistance(pos1.x, pos1.y, pos2.x, pos2.y));
    }
}

4、运行结果

控制台输出两个方块的距离,说明成功调用C++的GetDistance方法。

Unity——在C#中调用C++动态链接库(DLL)

 注:如果Unity已经在运行并且Dll已经存在,那么新的Dll写入生成会失败,此时需要关掉Unity再重新生成。

可能遇到的问题

问题1

问题描述:#include <DllForUnity.h>报错:无法打开源文件。

解决方法:依次点击“项目——配置属性——C/C++——常规”,在“附加包含目录”中加入.h文件所在的文件夹路径。

Unity——在C#中调用C++动态链接库(DLL)

问题2

问题描述:unity控制台报错: 

 Assets\Main.cs  error CS0246: The type or namespace name 'DllImportAttribute' could not be found (are you missing a using directive or an assembly reference?)

Assets\Main.cs   error CS0246: The type or namespace name 'DllImport' could not be found (are you missing a using directive or an assembly reference?)

Unity——在C#中调用C++动态链接库(DLL)

 解决方法:

1:一定要 using System.Runtime.InteropServices;

2: [DllImport(“XXXX”)] 需要放在类里面使用文章来源地址https://www.toymoban.com/news/detail-499216.html

到了这里,关于Unity——在C#中调用C++动态链接库(DLL)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python调用动态链接库(DLL)

    Python调用动态链接库(DLL) 动态链接库(Dynamic Link Libraries,简称DLL)是一种被多个程序共享的库文件,可以被用于将程序分解为小模块,减少内存占用,加快程序运行速度。而Python作为一种高级编程语言,可以方便地调用外部的DLL文件。 在Python中,可以使用ctypes模块来调用

    2024年02月13日
    浏览(51)
  • LabVIEW调用动态链接库DLL

    LabVIEW调用动态链接库DLL 要调用DLL,首先必须确定该库是C/ C ++ DLL还是Microsoft .NET Assembly / .NET DLL。 若要确定具有哪种类型的库,可以检查DLL文件的可移植可执行(PE)标头。 DLL 是 C/ C ++ DLL : 1.       如果没有头文件,请查找头文件(* .h)或函数原型定义,请跳

    2024年02月03日
    浏览(45)
  • Java JNA调用dll动态链接库

    记录学习内容 C编译dll环境:         IDE:Clion         ToolChains:MinGW64 Java环境:         版本:jdk1.8 64位         JNA依赖版本:5.2.0 (可根据需要升级,本文以此版本为例) JNA(Java Native Access )提供一组Java工具类用于在运行期间动态访问系统本地库(native library:如W

    2024年02月12日
    浏览(43)
  • Rust:使用libloader调用动态链接库 (DLL)

    掘金为同人创作:掘金 最近需要使用Rust 动态调用 动态链接库,本来打算是使用 libloading 的,但是 libloading 在调用dll中的函数的时,是必须要在编译时确定参数和return的类型的。但后来发现了 libloader 这个包包, libloader 是基于 libloading 的,但是操作起来却比 libloader 方便。

    2023年04月10日
    浏览(49)
  • 前端(node.js)调用dll动态链接库

    使用 js node 调用dll 动态链接库. github地址如下,包含dll,里面就一个Add方法暴露出来 github Windows 11 22H2 node v16.20.0 Python 3.11.2 需要安装这俩库 ffi-napi app.js 第一种不好使,曲线救国的方式这个是。 python-shell app.js python

    2024年02月16日
    浏览(45)
  • Python 使用 ctypes 调用 C/C++ DLL 动态链接库

    ctypes 有以下优点: Python内建,不需要单独安装 Python可以直接调用C/C++ 动态链接库(.dll 或 .so) 在Python一侧,不需要了解 c/c++ dll 内部的工作方式 提供了 C/C++ 数据类型与Python类型的相互映射,以及转换,包括指针类型。 ctypes 在下列场景可以发挥较大作用 运算量大的操作可以写

    2024年02月06日
    浏览(50)
  • C#调用C动态链接库

            已经没写过博客好久了,上一篇还是1年半前写的LTE Gold序列学习笔记,因为工作是做通信协议的,然后因为大学时没好好学习专业课,现在理论还不扎实,不敢瞎写;         因为工作原因,经常需要分析一些字节流数据,所以基本都是用C写的,结果输出在命令行

    2024年01月21日
    浏览(37)
  • Qt6之调用Windows下vc生成的动态链接库dll

    Qt是跨平台工具,显然能和windows的动态库一起使用。 在Windows操作系统上,库以文件的形式存在,并且可以分为动态链接库(DLL) 和静态链接库两种。动态链接库文控以.dll为后缀名,静态链接库文控以.lib为后缀名。不管是动态链接库还是静态链接库,都是向它们的调用者提供变

    2024年02月09日
    浏览(43)
  • C# 运用(codeDom和反射技术)动态编译dll ,动态调用

          在软件运用工程中,往往会根据各种各样,花样百出的需求来设计软件,在最近的项目中无意中,我就遇到了一个需求,据说是,客户要动态编译dll ,我“滴个乖乖”,这是要逆天啊! 话不多说,直接来点干货。 简单分享一下个小demo: 1.运用codeDom技术实现动态程序集

    2024年02月13日
    浏览(39)
  • C#调用C++ dll教程

    在使用C#开发客户端时,有时需要调用C++ dll,本篇博客来介绍C#程序如何调用C++ dll。 首先使用VS2022创建C++ dll项目,具体步骤如下: (1)选择Windows桌面向导,点击下一步, 取项目名,例如我的dll项目名是libMath (2)选择动态项目,勾选导出符号 (3)编写动态代码,代码如下

    2024年01月25日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包