结论

先放结论: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文件的更多相关文章

  1. java调用wkhtmltopdf生成pdf文件,美观,省事

    最近项目需要导出企业风险报告,文件格式为pdf,于是搜了一大批文章都是什么Jasper Report,iText ,flying sauser ,都尝试了一遍,感觉不是我想要的效果, 需要自己调整好多 ...

  2. c++与matlab联合编程,调用Deploytool 生成exe文件和dll文件(转)

    转自:http://www.cnblogs.com/xlw1219/archive/2012/12/25/2832222.html 首先必须知道联合编程需要知道的一些命令解释: mcc 的作用是将 . ...

  3. Unity C# 调用SaveFileDialog保存Excel文件

    本文原创,转载请注明出处:http://www.cnblogs.com/AdvancePikachu/p/6893934.html 本文学习如何把数据转存为Excel文件并调用SaveFileDial ...

  4. java调用matlab生成exe文件

    一.Matlab生成Java Package 1.在MATLAB的Command Window输入deploytool命令,选择Library Compiler. 2.在弹出的窗口选择Java Pac ...

  5. 调用 sphinx-build生成HTML文件

    安装 Sphinx $ easy_install sphinx Searching for sphinx Reading http://pypi.python.org/simple/sphinx/ R ...

  6. Unity中调用Windows窗口选择文件

    1.OpenFileName数据接收类,如下: using UnityEngine; using System.Collections; using System; using System.Runt ...

  7. Unity中调用Windows窗口句柄以及根据需求设置并且解决扩展屏窗体显示错乱/位置错误的Bug

    问题背景: 现在在搞PC端应用开发,我们开发中需要调用系统的窗口以及需要最大化最小化,缩放窗口拖拽窗口,以及设置窗口位置,去边框等功能 解决根据: 使用user32.dll解决 具体功能: Unity ...

  8. ASP.NET生成压缩文件(rar打包)

    首先引用ICSharpCode.SharpZipLib.dll,没有在这里下载:http://files.cnblogs.com/files/cang12138/ICSharpCode.SharpZi ...

  9. C# 怎么生成DLL文件(转)

    有两种方法:     但是一般这个使用     打开VS2008,依次点击:菜单->文件->新建项目->项目类型visual C#(这里假设为该项目所取的名字是DllBuild)-& ...

  10. 生成hprof文件,用MAT进行分析

    生成hprof文件可以在DDMS选中进程点击窗口左上角的"dump hprof file"按钮来直接生成,也可以通过在程序加代码中来生成 代码2: void generateHpr ...

随机推荐

  1. List子集合__小记

    List集合的子实现类的特点: ArrayList: 底层数据结构是数组的形式,满足数组结构的特点:查询快,增删慢 从线程安全问题来看:线程不安全的,不同步,执行效率高 Vector: 底层数据结构是 ...

  2. JDK源码-StringJoiner源码分析

    背景 功能描述:将多个元素使用指定符号前后连接为字符串:eg:1 2 3 4 5 , => 1,2,3,4,5 要点: 多个元素 指定分隔符 分隔符只在元素之间,不能作为第一或最后一个 使用方法 ...

  3. EntityCleanFramework

    EF几乎是按照领域的概念诞生,它可以和Clean结合(ECF是我新想出的名字).ECF 是为了统一业务架构开发方式,也可以说成在 微服务架构 中服务的通用开发方式.当有了统一开发方式后,协作将更上一层 ...

  4. CSSRelated

    CSS 几种常用的清除浮动方法 ️️️ 父级 div 定义伪类:after 和 zoom; /* 这个class名指的是需要清除浮动的父级 */ .clearfloat:after { display ...

  5. vscode c++食用指南

    准备 配置环境为机房的 win10. 首先你需要下载 vscode. 可以从官网下载:https://code.visualstudio.com/Download 配置编译c++ 下载完之后安装好,界 ...

  6. [ansible]wget批量调用shell脚本

    前言 相较于使用playbook,个人更习惯于编写shell脚本.如果需要多台服务器执行某一任务,可以将脚本放在某个http服务目录下,比如nginx,然后通过ansible的shell模块让服务器通 ...

  7. js判断h5页面地址的打开方式(微信、pc、移动端)

    1 function isOpenMode(){ 2 //平台.设备和操作系统 3 var system = { 4 win: false, 5 mac: false, 6 xll: false, 7 ...

  8. 【腾讯云 Cloud Studio 实战训练营】提升开发效率与协作:探索腾讯云 Cloud Studio 的强大功能与优势

    一.前言 前几天发生了一个故事,发生了这样一个情景:一位新加入的同事刚刚入职不久,领取了一台崭新的电脑.随后,他投身于一个新项目,但却遇到了一个困扰:由于这台电脑没有管理员权限,他无法在上面安装所需的 ...

  9. 《Java极简设计模式》第01章:单例模式(Singleton)

    作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all ...

  10. Flutter系列文章-Flutter应用优化

    当涉及到优化 Flutter 应用时,考虑性能.UI 渲染和内存管理是至关重要的.在本篇文章中,我们将通过实例深入讨论这些主题,展示如何通过优化技巧改进你的 Flutter 应用. 代码性能优化 1. ...