每次我重新加载项目时,统一的 Csproj 文件都会更改
Csproj file in unity changes everytime i reload the project
我想更改我的统一项目的 'csproj' 文件,以便能够按照 this 回答建议访问特定库。
我正在手动编辑文件,但每次我重新加载项目时,'csproj' 文件 returns 都会恢复到初始状态。
这是一个常见问题吗?有没有办法避免这种情况并永久更改文件?
编辑:我的目标是使用 CSharpCodeProvider 所以如果有另一种方法可以不改变 'csproj' 文件,我会很乐意采用这种方法
据我所知,您无法阻止 Unity 在重新编译您的脚本时覆盖您的 csproj 文件。
在使用较大的代码库和 Unity3D 时,我倾向于将大部分代码放入单独的 .Net 程序集 (DLL) 中。当我在多个项目和游戏服务器之间共享代码时,这对我很有帮助,而且 Unity 在检测到更改时不需要编译所有脚本。
为此启动您选择的 .Net IDE 并创建一个新的 class 库 项目(它将输出一个 .dll)。确保它针对 .Net Framework 3.5 或更低版本。然后,在 post-build 步骤中将输出的 .dll 复制到 Unity 项目的 Assets 文件夹中。我喜欢使用 post-build 步骤来防止我在更改后忘记复制程序集。
Unity 在创建 C# 项目时会自动引用项目 Assets 文件夹中的 DLL。这意味着所有包含的代码都可以在您的脚本中使用。但请注意,反之则不会那么容易:您不能在单独的项目中使用来自 Unity 脚本的代码。
根据您想用 CSharpCodeProvider 做什么,您可以将生成逻辑(和必要的 Import
指令)放入这样一个单独的项目中。
编辑:有关我们如何设置项目结构的更多信息,您可以在 Unite11 的 Jagged Alliance Online 上观看首席程序员的 this talk。
正如 Suigi 所建议的,我在 .Net IDE (SharpDevelop) 的帮助下创建了一个 .dll 文件,并将其复制到 unity 的 'Assets' 文件夹中。
(How do i create a .dll file with SharpDevelop)
这是我为生成 .dll 文件而编写的 class:
using System;
using System.Collections.Generic;
using System.CodeDom.Compiler;
using System.Diagnostics;
using Microsoft.CSharp;
using System.Reflection;
namespace dllTest {
public class AssemblyGeneration {
public static Assembly generateAssemblyFromCode(string code, string assemblyFilename) {
CSharpCodeProvider codeProvider = new CSharpCodeProvider();
System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = false;
parameters.OutputAssembly = assemblyFilename + ".dll";
CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, code);
Assembly assembly = null;
if (!results.Errors.HasErrors) {
assembly = results.CompiledAssembly;
return assembly;
}
else {
return null;
}
}
}
}
为了在任何统一脚本中使用它,只需使用命名空间 'dllTest'。然后,您可以调用 AssemblyGeneration.generateAssemblyFromCode(...) .
为了完整起见:
Unity 中有一个未记录的功能,它允许您使用 AssetPostprocessor
:
编辑生成的 .csproj
文件(以编程方式)
在 Assets
下任何名为 Editor
的文件夹中,创建具有以下结构的 class:
public class CsprojPostprocessor : AssetPostprocessor {
public static string OnGeneratedCSProject(string path, string content) {
return PatchCsprojContent(content);
}
}
其中 PathCsprojContent
是一个函数 returns .csproj
文件的补丁版本,添加了您需要的内容。
如果您只想修补某些.csproj
个文件,您可以事先检查路径。例如,如果您只想处理名为 Assembly-CSharp.csproj
的资产 .csproj
文件,则可以将以下检查添加到 OnGeneratedCsProject
的开头:
if (!path.EndsWith("Assembly-CSharp.csproj")) {
return content;
}
我想更改我的统一项目的 'csproj' 文件,以便能够按照 this 回答建议访问特定库。
我正在手动编辑文件,但每次我重新加载项目时,'csproj' 文件 returns 都会恢复到初始状态。
这是一个常见问题吗?有没有办法避免这种情况并永久更改文件?
编辑:我的目标是使用 CSharpCodeProvider 所以如果有另一种方法可以不改变 'csproj' 文件,我会很乐意采用这种方法
据我所知,您无法阻止 Unity 在重新编译您的脚本时覆盖您的 csproj 文件。
在使用较大的代码库和 Unity3D 时,我倾向于将大部分代码放入单独的 .Net 程序集 (DLL) 中。当我在多个项目和游戏服务器之间共享代码时,这对我很有帮助,而且 Unity 在检测到更改时不需要编译所有脚本。
为此启动您选择的 .Net IDE 并创建一个新的 class 库 项目(它将输出一个 .dll)。确保它针对 .Net Framework 3.5 或更低版本。然后,在 post-build 步骤中将输出的 .dll 复制到 Unity 项目的 Assets 文件夹中。我喜欢使用 post-build 步骤来防止我在更改后忘记复制程序集。
Unity 在创建 C# 项目时会自动引用项目 Assets 文件夹中的 DLL。这意味着所有包含的代码都可以在您的脚本中使用。但请注意,反之则不会那么容易:您不能在单独的项目中使用来自 Unity 脚本的代码。
根据您想用 CSharpCodeProvider 做什么,您可以将生成逻辑(和必要的 Import
指令)放入这样一个单独的项目中。
编辑:有关我们如何设置项目结构的更多信息,您可以在 Unite11 的 Jagged Alliance Online 上观看首席程序员的 this talk。
正如 Suigi 所建议的,我在 .Net IDE (SharpDevelop) 的帮助下创建了一个 .dll 文件,并将其复制到 unity 的 'Assets' 文件夹中。
(How do i create a .dll file with SharpDevelop)
这是我为生成 .dll 文件而编写的 class:
using System;
using System.Collections.Generic;
using System.CodeDom.Compiler;
using System.Diagnostics;
using Microsoft.CSharp;
using System.Reflection;
namespace dllTest {
public class AssemblyGeneration {
public static Assembly generateAssemblyFromCode(string code, string assemblyFilename) {
CSharpCodeProvider codeProvider = new CSharpCodeProvider();
System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = false;
parameters.OutputAssembly = assemblyFilename + ".dll";
CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, code);
Assembly assembly = null;
if (!results.Errors.HasErrors) {
assembly = results.CompiledAssembly;
return assembly;
}
else {
return null;
}
}
}
}
为了在任何统一脚本中使用它,只需使用命名空间 'dllTest'。然后,您可以调用 AssemblyGeneration.generateAssemblyFromCode(...) .
为了完整起见:
Unity 中有一个未记录的功能,它允许您使用 AssetPostprocessor
:
.csproj
文件(以编程方式)
在 Assets
下任何名为 Editor
的文件夹中,创建具有以下结构的 class:
public class CsprojPostprocessor : AssetPostprocessor {
public static string OnGeneratedCSProject(string path, string content) {
return PatchCsprojContent(content);
}
}
其中 PathCsprojContent
是一个函数 returns .csproj
文件的补丁版本,添加了您需要的内容。
如果您只想修补某些.csproj
个文件,您可以事先检查路径。例如,如果您只想处理名为 Assembly-CSharp.csproj
的资产 .csproj
文件,则可以将以下检查添加到 OnGeneratedCsProject
的开头:
if (!path.EndsWith("Assembly-CSharp.csproj")) {
return content;
}