Unity 代码调用重新生成csproj文件
结论
先放结论:editor代码中直接调用
Unity.CodeEditor.CodeEditor.CurrentEditor.SyncAll();
原因
在一些操作后,比如修改csc.rsp的内容之后,需要重新生成csproj文件
方法是 Edit -> Preferences -> External Tools -> Regenerate project files
但是多按几次就比较烦了,想通过代码调用生成csproj文件
但是网上直接搜又找不到,可能因为关键词不对
首先查看unity官方开源的编辑器代码
找到了这段
private void RegenerateProjectFiles()
{
var rect = EditorGUI.IndentedRect(EditorGUILayout.GetControlRect(new GUILayoutOption[] {}));
rect.width = 252;
if (GUI.Button(rect, "Regenerate project files"))
{
SyncVS.Synchronizer.Sync();
}
}
和按钮上的文字一模一样,应该就是这个了。
但是UnityEditor.SyncVS这个类访问权限是internal,直接访问不了,又不想再用反射一层层调
VS里面跳转到UnityEditor.SyncVS这个类的定义,可以看到程序集是UnityEditor.CoreModule, 也就是UnityEditor.dll这个文件
使用ILSpy导入这个dll,可以看到一堆诸如
[assembly: InternalsVisibleTo("Unity.InternalAPIEditorBridge.001")]
这样的内容。
Unity不想把所有方法都直接开放出来(所有人随便就能调用也容易出bug),又要给其他程序集使用,就预定义了一堆这种东西
只要一个程序集的名字在这里出现就可以调用UnityEditor.CoreModule的internal访问权限。
挑一个没被占用的(可能会被安装的Packages包占用),就“Unity.InternalAPIEditorBridge.001”了
新建文件夹"Assets/Editor/Unity.InternalAPIEditorBridge.001"
新建asmdef文件"Assets/Editor/Unity.InternalAPIEditorBridge.001/Unity.InternalAPIEditorBridge.001.asmdef"
新建一个C#代码文件"Assets/Editor/Unity.InternalAPIEditorBridge.001/UnityEditorExterns.cs"
namespace UnityEditor
{
public static class UnityEditorExterns
{
public static void RegenerateCSharpProjectFiles()
{
UnityEditor.SyncVS.Synchronizer.Sync();
}
}
}
然后在正常的Editor代码文件里面调用即可
然后问题来了,生成文件之后,发现VS里面的引用不太对,甚至刚才写的UnityEditorExterns.RegenerateCSharpProjectFiles()都找不到引用了
对比手动去Preferences窗口点击之后生成的文件,也是有差距的。
难道被什么覆盖了?全局搜索“Regenerate project files”,在“com.unity.ide.visualstudio@2.0.14/Editor/VisualStudioEditor.cs”里面找到下面的内容
private void RegenerateProjectFiles()
{
var rect = EditorGUI.IndentedRect(EditorGUILayout.GetControlRect(new GUILayoutOption[] {}));
rect.width = 252;
if (GUI.Button(rect, "Regenerate project files"))
{
_generator.Sync();
}
}
搜索“_generator.Sync()” 又找到了下面的内容
public void SyncAll()
{
AssetDatabase.Refresh();
_generator.Sync();
}
看来如果能调用到这个SyncAll(), 应该就可以了
继续追踪后,发现这个方法是实现Unity.CodeEditor.IExternalCodeEditor的接口方法,而IExternalCodeEditor这个接口实例可以通过Unity.CodeEditor.CodeEditor.CurrentEditor取到, 这一路都是public的,甚至不需要“InternalAPIEditorBridge”
直接调用
Unity.CodeEditor.CodeEditor.CurrentEditor.SyncAll();
执行后发现生成了正确的csproj文件
Unity 代码调用重新生成csproj文件的更多相关文章
- java调用wkhtmltopdf生成pdf文件,美观,省事
最近项目需要导出企业风险报告,文件格式为pdf,于是搜了一大批文章都是什么Jasper Report,iText ,flying sauser ,都尝试了一遍,感觉不是我想要的效果, 需要自己调整好多 ...
- c++与matlab联合编程,调用Deploytool 生成exe文件和dll文件(转)
转自:http://www.cnblogs.com/xlw1219/archive/2012/12/25/2832222.html 首先必须知道联合编程需要知道的一些命令解释: mcc 的作用是将 . ...
- Unity C# 调用SaveFileDialog保存Excel文件
本文原创,转载请注明出处:http://www.cnblogs.com/AdvancePikachu/p/6893934.html 本文学习如何把数据转存为Excel文件并调用SaveFileDial ...
- java调用matlab生成exe文件
一.Matlab生成Java Package 1.在MATLAB的Command Window输入deploytool命令,选择Library Compiler. 2.在弹出的窗口选择Java Pac ...
- 调用 sphinx-build生成HTML文件
安装 Sphinx $ easy_install sphinx Searching for sphinx Reading http://pypi.python.org/simple/sphinx/ R ...
- Unity中调用Windows窗口选择文件
1.OpenFileName数据接收类,如下: using UnityEngine; using System.Collections; using System; using System.Runt ...
- Unity中调用Windows窗口句柄以及根据需求设置并且解决扩展屏窗体显示错乱/位置错误的Bug
问题背景: 现在在搞PC端应用开发,我们开发中需要调用系统的窗口以及需要最大化最小化,缩放窗口拖拽窗口,以及设置窗口位置,去边框等功能 解决根据: 使用user32.dll解决 具体功能: Unity ...
- ASP.NET生成压缩文件(rar打包)
首先引用ICSharpCode.SharpZipLib.dll,没有在这里下载:http://files.cnblogs.com/files/cang12138/ICSharpCode.SharpZi ...
- C# 怎么生成DLL文件(转)
有两种方法: 但是一般这个使用 打开VS2008,依次点击:菜单->文件->新建项目->项目类型visual C#(这里假设为该项目所取的名字是DllBuild)-& ...
- 生成hprof文件,用MAT进行分析
生成hprof文件可以在DDMS选中进程点击窗口左上角的"dump hprof file"按钮来直接生成,也可以通过在程序加代码中来生成 代码2: void generateHpr ...
随机推荐
- 基于.Net Core实现的飞书文档一键导出服务(支持多系统)
feishu-doc-export 一个支持Windows.Mac.Linux系统的飞书文档一键导出服务,仅需一行命令即可将飞书知识库的全部文档同步到本地电脑.导出速度嘎嘎快,实测700多个文档导出只 ...
- Django容易被遗忘却无比重要的框架默认文件介绍及使用方法
在Python Web开发领域,Django框架的地位犹如璀璨的明星,其全面.高效和安全的特性使其在全球范围内广受欢迎.本文将全面解析Django框架的默认文件,并深入探讨每个文件及其组成的意义和用途 ...
- Code Generate V2.0 代码生成器
Code Generate 代码生成器 系统首页 使用说明 系统默认会根据SQL生成字段信息 className.fieldList.classComment 如下所示: 建表语句 CREATE TA ...
- Matlab GUI-Gamma选择工具
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path s ...
- 关于bzoj3306(树)的一些反思
1.加零大法好,用好没烦恼 2.不要瞎开long long 3.万物皆可变成wa 4.如果超时,试图把循环中中的东西拉到外面来
- C++ 核心指南之 C++ 哲学/基本理念(下)
C++ 核心指南(C++ Core Guidelines)是由 Bjarne Stroustrup.Herb Sutter 等顶尖 C+ 专家创建的一份 C++ 指南.规则及最佳实践.旨在帮助大家正确 ...
- AcWing 第 92 场周赛 C题 4866. 最大数量 题解
原题链接 链表 + 并查集乱搞做法: 思路 首先可以发现,想要让度数尽量大,那我们应该构造成菊花图,即下图所示: 对于每个需求,我们可以知道,如果之前他们没有连在一起,那我们一定得把他们连在一起,该过 ...
- vite — 超快且方便的编译工具
我们编写的代码,比如 ES6. TypeScript.react 等是不能被浏览器直接识别的,需要通过 webpack .rollup 这样的构建工具来对代码进行转换.编译. 但随着项目越来越大,需要 ...
- chrome浏览器中使用adblockplus拦截广告
adblock plus是一款可以屏蔽广告以及任何你想屏蔽元素的软件,屏蔽之后的效果如下图所示,abp自动屏蔽广告,还可以自行添加屏蔽内容,右上角红色的ABP标识就是该软件 下载地址: htt ...
- spring多数据源动态切换的实现原理及读写分离的应用
简介 AbstractRoutingDataSource是Spring框架中的一个抽象类,可以实现多数据源的动态切换和路由,以满足复杂的业务需求和提高系统的性能.可扩展性.灵活性. 应用场景 多租户支 ...