You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Premake5批量链接文件夹中的所有Unity DLL?

问题:Premake5批量链接Unity DLL的需求

我正将部分Unity代码迁移至VS2022项目以使用插件,由于代码引用大量Unity类,需链接Unity安装目录中的DLL文件。我希望用Premake5生成项目,目前仅能通过libdirs指定目录后,用link手动指定单个DLL(如UnityEditor.dll),但link指令似乎不支持files那样的通配符。请问是否有无需手动罗列所有DLL的方法?也可接受具备可移植性的Lua解决方案。

以下是仅链接单个DLL的参考premake.lua代码:

local ROOT   = "../"
local SOURCE = ROOT.."Source/"
local BUILD  = ROOT.."Build/"

workspace "RELoad_CorePlugin"
    configurations { "Debug", "Release" }
    location (ROOT)
    dotnetframework "net6.0"

project "RELoad_Core"
    kind "SharedLib"
    language "C#"
    libdirs "C:/Program Files/Unity/2021.3.12f1/Editor/Data/Managed/UnityEngine/" -- hard coded for now
    links "UnityEditor.dll" 

    targetdir (ROOT.."Output")
    location (BUILD)
    files (SOURCE.."Core/**.cs")
解决方案

方法一:Lua遍历目录自动收集所有DLL

Premake基于Lua,可直接用其文件系统API遍历指定目录下的DLL文件,批量添加到links中。修改后的脚本示例:

local ROOT   = "../"
local SOURCE = ROOT.."Source/"
local BUILD  = ROOT.."Build/"

-- 可通过环境变量或命令行参数传递路径,提升可移植性
local UNITY_MANAGED_DIR = os.getenv("UNITY_MANAGED_DIR") or "C:/Program Files/Unity/2021.3.12f1/Editor/Data/Managed"

-- 遍历目录获取所有.dll文件(支持子目录)
local function get_all_dlls(dir)
    local dlls = {}
    local files = os.matchfiles(dir .. "/**/*.dll")
    for _, file in ipairs(files) do
        -- 提取不带路径的文件名,links仅需文件名
        table.insert(dlls, path.getname(file))
    end
    return dlls
end

workspace "RELoad_CorePlugin"
    configurations { "Debug", "Release" }
    location (ROOT)
    dotnetframework "net6.0"

project "RELoad_Core"
    kind "SharedLib"
    language "C#"
    -- 包含Unity所有托管DLL的目录(按需添加子目录)
    libdirs {
        UNITY_MANAGED_DIR .. "/UnityEngine",
        UNITY_MANAGED_DIR .. "/UnityEditor"
    }
    -- 批量链接所有收集到的DLL
    links(get_all_dlls(UNITY_MANAGED_DIR))

    targetdir (ROOT.."Output")
    location (BUILD)
    files (SOURCE.."Core/**.cs")

方法二:筛选特定DLL(避免冗余链接)

如果不需要链接目录下全部DLL,可在遍历过程中添加过滤逻辑,比如仅保留Unity前缀的DLL:

local function get_unity_dlls(dir)
    local dlls = {}
    local files = os.matchfiles(dir .. "/**/*.dll")
    for _, file in ipairs(files) do
        local dll_name = path.getname(file)
        -- 只保留以Unity开头的DLL
        if string.startswith(dll_name, "Unity") then
            table.insert(dlls, dll_name)
        end
    end
    return dlls
end

-- 在project中替换为该函数:
links(get_unity_dlls(UNITY_MANAGED_DIR))

可移植性优化

  • 从环境变量UNITY_MANAGED_DIR读取Unity路径,不同机器只需配置对应环境变量即可,无需修改脚本。
  • 支持通过命令行参数传递路径,执行时使用:premake5 vs2022 --unitydir="你的Unity托管目录路径",对应的Lua代码:
local UNITY_MANAGED_DIR = _OPTIONS["unitydir"] or os.getenv("UNITY_MANAGED_DIR") or "默认Unity托管目录路径"

内容的提问来源于stack exchange,提问作者Robert Hull

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:21:00