unity2017自定义编译dll
适用于自定义编译平台和编译符合,把C#源码文件编译成dll。(用于InjectFix之类的热更方案)
适用于unity2017环境,代码暂时不方便贴出记述一下思路。
参考:Unity官方C#源码 https://github.com/Unity-Technologies/UnityCsReference
1. 通过反射取用一些访问不到的Editor代码
- GetCompilationDefines(EditorScriptCompilationOptions, BuildTargetGroup, BuildTarget)
- GetUnityAssmblies(bool, BuildTargetGroup, BuildTarget)
- GetPrecompiledAssemblies(bool, BuildTargetGroup, BuildTarget)
- CompatibilityProfileToClassLibFolder(ApiCompatibilityLevel)
直接复制源码过来改动
- struct PrecompiledAssembly
- enum EditorScriptCompilationOptions
- class MonoInstallationFinder
2. Unity编译dll的原理
- 先生成一个编译参数的清单文件,包括编译符号定义、源代码文件、库引用等,可以在项目目录下的
Temp/UnityTempFile-XXXXX查看。 - 之后会通过类似
mono.exe mcs.exe @Temp/UnityTempFile-XXX的命令来启动编译器进行编译
已经很明显了,要实现自定义编译dll,主要解决两个问题:
- 怎么找到mono和mcs的路径
- 怎么生成清单文件
3. 找到mono和mcs的路径
在MonoInstallationFinder.cs中直接增加函数
public static string GetMonoProfileLibDirectory(BuildTarget group)
{
ApiCompatibilityLevel compatibilityLevel = PlayerSettings.GetApiCompatibilityLevel(group);
string profile;
string monoInstall;
// 因为生产环境配置比较固定, 写的比较糙
// 具体可查阅"mono"和"MonoBleedingEdge"文件夹的区别(旧版本|新版本)
if (compatibilityLevel == ApiCompatibilityLevel.NET_2_0)
{
profile = "2.0-api";
monoInstall = MonoBleedingEdgeInstallation;
}
else
{
profile = "unity"; // .net-2.0-subset
monoInstall = MonoInstallation;
}
}
4. 生成清单文件
unity2017对自定义dll名称有一定支持,但不是太好,还是使用默认的"Assembly-CSharp"这些,参考官方说明 https://docs.unity3d.com/2017.4/Documentation/Manual/ScriptCompileOrderFolders.html
写一个枚举方便使用
enum UnityDllNames
{
Assembly_CSharp_firstpass,
Assembly_CSharp,
Assembly_CSharp_Editor_firstpass,
Assembly_CSharp_Editor,
}
可以写出根据文件路径判断所属dll的函数UnityDllNames GetDllType(string path), 根据这四个dll的依赖关系,可以写出判断dll是否需要引用的参数bool NeedDllRef(UnityDllNames dll, UnityDllNames refDll),源代码文件很容易就可以列出来了
项目内的dll文件,结合路径和PluginImporter的值来判断是否引用;比较难处理的是Unity自己提供的引用
- 通过最开始提到的
GetUnityAssemblies()和GetPrecompiledAssemblies()可以获取部分,非编辑器构建下需要额外排除名字带有"Editor"的引用 - 还有一些额外的固定引用,通过
GetMonoProfileLibDirectory()获取路径拼接,System.Runtime.Serialization.dll,System.Xml.Linq.dll,UnityScript.dll,UnityScript.Lang.dll,Boo.Lang.dll - 可能还有一些遗漏或不一致的。如果不是直接在实际游戏中用到这个编译出来的dll,不需要做到和Unity生成的完全一致
通过GetCompilationDefines()获取编译符号定义
存在mcs.rsp的加一下
5. 执行编译
生成清单文件后,找到对应的mono、mcs路径,拼接执行即可,一般是MonoBleedingEdge/bin/mono.exe和MonoBleedingEdge/lib/mono/4.5/mcs.exe
unity2017自定义编译dll的更多相关文章
- 在SSIS中使用自定义的DLL文件
原文:在SSIS中使用自定义的DLL文件 步骤1.开发dll(需要签名) using System;using System.Collections.Generic;using System.Text ...
- 自定义编译gdal库
作者:朱金灿 来源:http://blog.csdn.net/clever101 使用下载下来的gdal库的makefile来编译gdal库,生成的gdal库的名字debug版本和release版本都 ...
- Delphi编译dll时出错"Cannot debug project unless a host application is defined.use the run|parameters...dialog box."
问题: 在编写DLL程序的时候,按下F9或者按下那个绿色的箭头,会报错,如下 原因: 是因为你按下的F9或者那个绿色箭头是表示“Run”这个程序,但是DLL不是可执行文件,所以当然不能够运行,所以就会 ...
- Qmake 配置自定义编译过程
Qmake 配置自定义编译过程 需求:动态更换资源文件 在 Windows10 下编写 Qt 项目时,有这样的需求: 程序用到的资源文件可以动态更换而不需要重新编译整个项目 解决方案 0.1 将所有的 ...
- windows下用GCC编译DLL
此程序有3个文件,分别为 export.h .export.c .main.c export.h 文件内容 /*此头很有必要,别人在调用的时候知道有哪些方法*/ #ifdef BUILD_DLL #d ...
- MinGW g++.exe 编译 DLL 时,导出函数名带@的问题
今天尝试用CodeBlocks写了一个简单的Dll,发现生成的 dll 文件导出的函数名后面都有一个 @xxx 从生成的 libDll2.def 中看到: EXPORTS DllMain@ @ Max ...
- 反编译DLL并修改DLL中的内容
使用场景:针对当前用户因不愿意进行软件版本升级,但又希望可以解决当前问题,此时可以考虑通过反编辑DLL进行修改内容,然后重新生成新的DLL 操作步骤: 1.首先使用ILSpy.exe反编译DLL,查看 ...
- MinGW编译dll并引用
记得某位神仙曾经说过:一个项目不使用dll简直是一场灾难.(滑稽) 这篇文章以A+B/A-B为范例,来介绍如何在MinGW下编译dll并引用. 首先你要安装MinGW,并配置好环境变量(不配置环境变量 ...
- Stupid && 祖传Fortran代码救赎之路(编译Dll)
Stupid && 祖传Fortran代码救赎之路(编译Dll) gfortran编译动态库 在Windows平台下,Intel Fortran安装过于庞大且费事(现在集成到OneAP ...
- MinGW(GCC)编译DLL文件
这两天用CB(Code::Blocks)写个小程序,要编译出DLL供VB(6)使用.CB使用mingw-gcc作为编译器,在库文件的产出上跟VC.VS之类的IDE略有不同. 由于C语言的基础知识不是太 ...
随机推荐
- AR增强现实 之Metaio For Unity 开发 之HelloWorld
开发工具 unity 4.6 MetaioSDK 6.1 代码编辑器 VS 2013 上图不会配置的请自行百度 1.创建项目并且导入Metaio SDk 开发包 2.导入后目录图 ...
- [Java基础]String,StringBuffer,StringBuilder的区别
String 和 StringBuffer/StringBuilder应该分开来看 java.lang.String源码中的注释说明 java.lang.StringBuffer源码中的注释说明 ja ...
- Day02_Java_作业
A:选择题 1. 若有定义:int a,b; a=a+10;则执行上述语句后,a的值是(d). A. 10 B. 11 C. 0 D. 编译产生错误 2. 以下选项中变量均已正确定义,合法的赋值语句是 ...
- 【原创】Ftrace使用及实现机制
Ftrace使用及实现机制 版权声明:本文为本文为博主原创文章,转载请注明出处 https://www.cnblogs.com/wsg1100 如有错误,欢迎指正. 目录 Ftrace使用及实现机制 ...
- 体验IntelliJ IDEA的远程开发(Remote Development)
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 IDEA的远程开发功能,可以将本地的编译.构 ...
- Django 组织json格式
@api_view(['GET', 'POST']) def api_test(request): classes = Classes.objects.all() # classes_data = C ...
- AWVS14破解docker一键安装
先上个图 2021最新版 1.使用docker查看是否有awvs: [root@hadoop-01 awvs13-linux]# docker search awvs NAME ...
- [golang]使用gopsutil获取系统信息
前言 在python中有个psutil库用于获取系统信息,而go语言也有一个类似的库--gopsutil,功能差不多. 项目地址:https://github.com/shirou/gopsutil ...
- nflsoj 选数1 2 3
5711 取数-1 状态表示:1维 集合:前 \(i\) 个数里面所有的选法和 属性:所有的选法和的最大值 状态计算:选或不选 选:\(f(i-1)+a_i\) 不选:\(f(i-1)\) #incl ...
- ThreadLocal的学习心得
ThreadLocal是Java提供的线程本地存储机制,可以实现多线程环境下数据的隔离.主要特点是: 每个线程都有自己的实例副本,实现了线程的数据隔离.ThreadLocal中存储的值对其他线程都不可 ...