首页 > 系统相关 >Windows下Dll在Unity中使用的一般方式

Windows下Dll在Unity中使用的一般方式

时间:2025-01-11 17:32:34浏览次数:1  
标签:Windows hpp Dll int Unity static 动态链接库 include

Windows下Dll在Unity中使用的一般方式

Unity中虽然已经有广泛的库和插件,但是相较于C++的库生态而言,还是有一定的差距;因此本篇博文记录Windows下将C++函数打包成动态链接库在Unity中使用的一般方法。

环境

Visual Studio 2019 , Unity2022 , Windows11,OpenCV

说明

  1. Unity中有针对Windows 下DLL文件的自动加载机制,所以只要把打包好的动态链接库拷贝到 Assets/Plugins,然后在Unity脚本中进行注册便可以使用。
  2. 由于动态链接库本质上可以理解成一个插件,所以本次记录侧重 Unity和C++动态链接库函数的传参一致性问题

步骤

Visual Studio 2019

  1. 新建一个项目,在源文件中按照如下格式编写函数

​ 缩略版:

extern "C" {

	// 变量
    static bool isModelInitialized = false;

    __declspec(dllexport) int add( int width, int height) {
        return width + height;
    }

}

​ Demo:

#include "opencv2/highgui.hpp"
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
//#include"opencv2/xfeatures2d.hpp"
#include "SFace.h"
#include "opencv2/dnn.hpp"
#include "opencv2/calib3d.hpp"
#include "opencv2/video.hpp"
#include "face_detector.hpp"
#include <iostream>


using namespace cv;
using namespace declass;

extern "C" {

	// 
    static bool isModelInitialized = false;
    static YOLOv8_face* fdModel = nullptr;
    static SFace* face_recognizer = nullptr;
    static Mat targetFeature;

    __declspec(dllexport) bool reGetStartFaceBox(unsigned char* pixelData, int width, int height, int* box) {

        return false;
    }

    __declspec(dllexport) bool getStartFaceFeature(unsigned char* pixelData, int width, int height) {
        return true;
    }

    // 释放资源的函数
    __declspec(dllexport) void Cleanup() {
     {
        delete fdModel;
        delete face_recognizer;
        fdModel = nullptr;
        face_recognizer = nullptr;
        isModelInitialized = false;
       
    }

extern "C" 是一种 C++ 中的语言链接约定,用于指示编译器以 C 的方式处理函数的名称修饰(name mangling)规则。

__declspec(dllexport) 是 Microsoft 编译器特有的一个声明符,用于声明某个函数、变量或类在 DLL(动态链接库)中导出,使得它可以被其他程序或库调用。

image-20250111170515174

之后进行编译,便可以得到一个dll文件。

Unity

接下来需要将动态链接库拷贝到Unity的Assets/Plugins目录:

image-20250111170709616

接下来我们新建一个脚本,在Unity中注册我们编写好的函数

 public class FaceRecongnize
{
    // faceRecong是dll文件名字,函数名和上面的demo是一致的。
    [DllImport("faceRecong", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
    public static extern bool reGetStartFaceBox(IntPtr pixelData, int width, int height, int[] box);

    [DllImport("faceRecong", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
    public static extern bool getStartFaceFeature(IntPtr pixelData, int width, int height);

    [DllImport("faceRecong", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
    public static extern void Cleanup();

}

至于参数,比如我想把一个纹理,或者一个数组传入到动态链接库中进行赋值,一般是用指针进行传送,比如上面的纹理数据和box,都是指针。

调用示例。

image-20250111171259391

PS:一个比较值得关注的点是,如果使用了第三方库,OpenCV,我们还需要把OpenCV相关的dll文件也拷贝到Assets/Plugins下,这是因为动态链接库之间也有一些依赖关系,我们需要把他们都导入进去。同时我建议如果要打包的话,因为可能跨设备运行,所以建议采用相对目录的方式,配置Visual Studio中的第三方库的依赖关系。

Refer

标签:Windows,hpp,Dll,int,Unity,static,动态链接库,include
From: https://www.cnblogs.com/curiositywang/p/18665918

相关文章

  • [笔记] 使用 Jenkins 和 Nginx 实现前端项目的持续集成与部署 (CICD) : 从 GitLab 拉
    在现代软件开发中,持续集成与持续部署(CI/CD)已经成为提高开发效率、保证代码质量的重要手段。对于前端项目来说,如何快速、稳定地将代码从开发环境推送到生产环境,是一个关键问题。本文将详细介绍如何使用Jenkins和Nginx实现前端项目的CI/CD流程,确保每次代码提交都能自动......
  • 在 Rider 中使用 C# 创建 Windows 窗体应用 Winforms
    1,创建项目newsolution创建一个解决方案2,打开设计器在Form1.cs上右键打开设计器认识一下Rider的界面参考微软官方的例子,添加如下属性:注:这里Listbox的大小设置成120,94失败,默认的是120,89。可以将DrawMode改为OwnerDrawVariable,就可以更改大小,但是要重写......
  • Unity URP Shader Graph 实现复古电视机效果
    想到一出实现一出的复古电视机效果实现。复古电视机效果显示展示:使用素材一张纹理需要放映的图片,一张遮罩贴图,一个电视机模型。UV使用Spherize模拟电视机球状显示屏。扫描线A效果扫描线B效果像素化/随机UV偏移屏幕做旧效果边缘变暗效果屏幕黑边效果自制一张合适......
  • Omnissa Dynamic Environment Manager 2412 - 个性化动态 Windows 桌面环境管理
    OmnissaDynamicEnvironmentManager2412-个性化动态Windows桌面环境管理Simplifymanagementofuserprofiles,environmentsettings,andpoliciesacrossdesktopsandapps.请访问原文链接:https://sysin.org/blog/omnissa-dynamic-environment-manager/查看最新版......
  • 又来了1 款好用的 Windows神器软件:好用且免费,绝不能错过!
    今天给大家介绍一个非常好用的截图录屏软件,这个软件完全免费,没有任何的广告,非常好用。VeryCapture截屏录屏软件软件无需安装,解压之后就能直接使用。它的核心功能非常多:有截图、长截图、GIF录制、视频录制、OCR和翻译等功能。软件支持全屏截图、矩形截图、任意截......
  • Windows下shell命令
    参数说明:- output.log文件名-Nv只隧道持续输出文件:Get-Content"output.log"-Wait  测试端口连通性telnet<host_name_or_ip><port>清除DNS缓存ipconfig/flushdns 运行rust输出日志:cargorun2>&1|Out-File-FilePathoutput.log-Encodingutf8运行npm服务......
  • 【解决方案】Windows 清理 C 盘,拒绝让 Desktop App 在 C 盘拉屎(配置/缓存/数据/预训练
    Windows有多磁盘管理,那又如何,许多程序为了节省上行带宽流量,会将大量数据/预训练模型默认下载到我们C盘的某个位置,动辄就是几GB甚至几十GB,有的干脆没有提供修改入口。安装系统时我特意为C盘留出200GB的空间,后来从职业装机那边了解到,对于个人和工作使用已经算非常大了。......
  • Hawkeye :一款Windows综合应急响应工具
    文章来源以下公众号:也总想挖RCE,喜欢的师傅点点关注!简介Hawkeye(鹰眼)一款基于golang开发的安全工具,旨在帮助安全工程师上机排查时能够快速的定位问题,提供排查思路。功能外连分析当发现主机存在恶意外连时,并且知道外连地址,能够快速的定位外连的进程,以及进程的连接信息。同时根......
  • 数据恢复技巧:适用于 Windows 的 11 款最佳数据恢复软件
    DATA是数字世界中无价之宝。任何类型的数据丢失都是一个严重的挫折,并且只有一个问题:“如何恢复我的文件?数据丢失可能会导致个人和专业方面的严重问题。数据恢复软件是检索已删除、格式化或丢失数据的生命线。 本文列出了适用于Windows11、Windows10及更低版本的最佳......
  • 理解Unity脚本编译过程:程序集
    https://docs.unity3d.com/Manual/script-compilation.html关于UnityC#脚本编译的细节,其中一个比较重要的知识点就是如何自定义Assembly。预定义的assembly默认情况下,Unity会按照这个规则进行编译。PhaseAssemblynameScriptfiles1Assembly-CSharp-firstpassRuntimes......