关闭

Unity Windows&Mac 编译和调试外部C#动态库(DLL)

标签: unity编译器
83人阅读 评论(0) 收藏 举报
分类:

目标实现

Windows 平台

工具

步骤

  • 创建 C# 类库工程

  • 引用 UnityEngine.dll 等其他库

  • 添加【成功生成时】的【后期生成事件命令行】
    $(SolutionDir)Build/.Project$(ProjectName).py $(ConfigurationName) $(TargetDir) $(TargetName) $(ProjectDir)$(IntermediateOutputPath)

  • 编写 Python 脚本,以便编译完毕,可以自动拷贝 DLL 等文件到 Unity 工程

注意脚本里面要包含 pdb2mdb,例如:

if isWin:
    p = subprocess.Popen([currentPath + "/pdb2mdb", targetName + ".dll"], shell = True, cwd = targetPath)
    p.wait()

    shutil.copy(targetPath + targetName + ".dll.mdb", resPath + targetName + ".dll.mdb")

另外,需要用 precompile.exe 来对 protobuf 的数据 dll 文件进行序列化和反序列化,如下:

if isWin:
    p = subprocess.Popen([currentPath + "/precompile", targetName + ".dll", "-o:" + targetName + ".AOT.dll", "-t:AOTDataConfig" ], shell = True, cwd = targetPath)

调试

在确定 DLL 对应的 mdb 文件有拷贝到 Unity 工程,就可以直接通过【附加 Unity 调试程序】来进行调试

Mac 平台

工具

  • Visual Studio for Mac 7.3.3

  • Unity 5.6

步骤

  • 将 Windows 平台所创建工程拷贝到 Mac 下

  • 准备修改 .csproj 文件 和 Python 脚本

因为安装 Visual Studio for Mac 时已经附带安装了 Mono.framework,所以不再需要额外安装 mono,自带的版本号为 5.4.1.7,如下所示:

编译工程,发现生成了 DLL 和其对应的 pdb 文件,使用命令:

/Library/Frameworks/Mono.framework/Versions/Current/bin/mono pdb2mdb.exe test.dll

提示不能进行转换,如下所示:

Error: A portable PDB can't be converted to mdb.

查阅官网(http://www.mono-project.com/docs/about-mono/releases/5.0.0/ ),提到已经使用【csc.exe】代替【mcs.exe】来进行编译了:

Replacing mcs with csc in user scripts should be straightforward but small issues can arise as command line arguments accepted by csc and features are not identical to mcs. For example, csc generates Portable PDB (.pdb) debug files instead of Mono’s MDB (.mdb) format.

 Portable 版本的 pdb 文件是无法转换成 mdb 文件,那么就将编译方式改成mcs.exe】,因为 Unity 也是用这种方式来编译的,编辑器方法 EditorUtility.CompileCSharp 调用如下:

更改每个 .csproj 工程配置文件,在里面添加如下属性:

  <PropertyGroup Condition=" '$(OS)' == 'Unix' ">
    <CscToolExe>mcs.exe</CscToolExe>
  </PropertyGroup>

表示在非 Windows 平台下使用【mcs.exe】进行编译。再次编译工程,可以发现在中间目录 obj\Debug 目录下生成了对应的 mdb 文件,那么修改 Python 脚本,来将这个 mdb 文件也拷贝到 Unity 工程下:

if isWin:
    p = subprocess.Popen([currentPath + "/pdb2mdb", targetName + ".dll"], shell = True, cwd = targetPath)
    p.wait()

    shutil.copy(targetPath + targetName + ".dll.mdb", resPath + targetName + ".dll.mdb")
else:
    shutil.copy(mdbPath + targetName + ".dll.mdb", resPath + targetName + ".dll.mdb")

另外,precompile.exe 的调用也需要更改,如下:

if isWin:
    p = subprocess.Popen([currentPath + "/precompile", targetName + ".dll", "-o:" + targetName + ".AOT.dll", "-t:AOTDataConfig" ], shell = True, cwd = targetPath)
else:
    p = subprocess.Popen(["/Library/Frameworks/Mono.framework/Versions/Current/bin/mono", currentPath + "/precompile.exe", targetName + ".dll", "-o:" + targetName + ".AOT.dll", "-t:AOTDataConfig" ], shell = False, cwd = targetPath)

调试

在确定 DLL 对应的 mdb 文件有拷贝到 Unity 工程,就可以直接通过【Run】→【Attach to Process...】来进行调试:

可以看到已经进行挂载调试了。



0
0
查看评论

Unity中使用和调试Dll

原文地址:http://jacksondunstan.com/articles/3052?utm_source=tuicool 正文: 本文意在指导你在Unity中创建、使用和调试一个.NET dll。你可以模块化你的代码,把它们组织成库,这样开发者只要导入一个单独的文件就可以使用你的库。从代码设计...
  • green_tea_great
  • green_tea_great
  • 2015-05-27 17:51
  • 4467

Unity3d调试外部dll

最近玩Unity用UnityVS+VS2013来调试脚本,
  • foreverml
  • foreverml
  • 2014-06-10 11:34
  • 1604

C# 调试动态库(DLL)

将调用DLL文件的工程中的“引用”上右键,选择“添加引用”,在弹出的对话框中,选择“dll文件的工程生成动态库的路径”下对应的DLL文件即可。
  • wangzhen209
  • wangzhen209
  • 2017-01-17 10:01
  • 1774

Unity中将c#导出DLL动态库

本文只作为参考,个人水平有限,望见谅! C#导出DLL,一开始就想到了将c++代码做成DLL的方法,各种复制粘贴宏定义,于是就找了一下C#导出DLL的一般方法,和后者如出一折,只是更简单一些,这里我就不详述了。于是乎就想到能不能写一个脚本,在Unity中可以直接导出动态库呢?再然后就知道了原来导出...
  • zzmkljd
  • zzmkljd
  • 2016-10-14 10:44
  • 1127

Unity 导入C# DLL、C\C++ DLL 等外部库

Untiy 导入C# DLL、C\C++ DLL、OSX BUNDLE、iOS Android 等插件。
  • l773575310
  • l773575310
  • 2017-05-18 12:00
  • 2283

Unity3d 调用 C++ DLL之 DLL回调Unity3d (C++ DLL回调 C#函数)

上篇 Unity3d 调用C++ DLL (Win平台) 介绍了简单的 Unity3d 调用 C++ DLL的方法,但是这样是不够的,这里再讲下通过函数指针让 C++ DLL中回调 Unity3d 的方式。 创建DLL 以及在 Unity3d 中调用 DLL 中函数在上篇中介绍了。首先,在C#...
  • cp790621656
  • cp790621656
  • 2015-05-15 20:16
  • 5081

vs调试动态库的方法(图解)

首先 ,dll 是以MFC的方式生成的,并且为了在调试dll时方便,我把dll和测试程序(一个控制台类型,一个MFC类型)都建在了一个工程下,这样可以在修改dll时通过下面的步骤设置生成dll的输出目录(比较方便)。 下面是我的dll工程的输出目录的配置,你可以输出dll到你的测试程序目录下 ...
  • sbfksmq
  • sbfksmq
  • 2016-06-17 18:43
  • 3459

在Unity中调试dll

在Unity中调试dll 项目中用到一个dll,想进入这个dll调试其中的代码,如何做呢? 1.使用ilspy反编译该dll 2.反编译成功后,选择菜单file->save code保存c#代码(包含一个csproj) 3.用visual studio打开2中得到的csproj文件,会打开...
  • sunny__chen
  • sunny__chen
  • 2017-02-16 16:23
  • 946

C#源程序编译成动态链接库(DLL)

一、 动态链接库         什么是动态链接库?DLL三个字母对于你来说一定很熟悉吧,它是Dynamic Link Library 的缩写形式,动态链接库 (...
  • gen504240809
  • gen504240809
  • 2013-02-25 20:39
  • 1945

Qt动态库调试方法

Qt动态库调试方法, 我写了一个动态库提供给客户端加在使用,但是在使用我的动态库生成的控件时, 发生了程序崩溃的情况,很明显是我动态库中代码出现了问题。而且我没有客户端代码, 只有客户端可运行程序。为了找出问题,所以要使用QtCreator的动态库调试功能。 1 先运行客户端程序,也就是需要调用...
  • u012199908
  • u012199908
  • 2016-01-18 16:46
  • 1611
    个人资料
    • 访问:3554927次
    • 积分:36070
    • 等级:
    • 排名:第137名
    • 原创:402篇
    • 转载:88篇
    • 译文:5篇
    • 评论:3425条
    个人说明
    联系方式:
    文章存档
    最新评论