我想更改Unity项目的'csproj'文件,以便能够以this回答消息来访问特定的库。
我手动编辑文件,但每次重新加载项目时,'csproj'文件都会返回初始状态。
这是一个常见问题吗?有没有办法避免这种情况并永久更改文件?
编辑:我的目标是使用 CSharpCodeProvider ,所以如果有其他方法可以不改变'csproj'文件,我很乐意采用这种方法
答案 0 :(得分:5)
据我所知,您不能阻止Unity在重新编译脚本时覆盖您的csproj文件。
当使用更大的代码库和Unity3D时,我倾向于将大部分代码放入单独的.Net程序集(DLL)中。当我在多个项目和游戏服务器之间共享代码时,这有助于我,Unity在检测到更改时不需要编译所有脚本。
为此,启动您选择的.Net IDE并创建一个新的类库项目(将输出.dll)。确保它定位于 .Net Framework 3.5 或更低版本。然后,在构建后的步骤中将输出.dll复制到Unity项目的 Assets 文件夹中。我喜欢使用后期构建步骤来防止我在更改后忘记复制程序集。
项目的 Assets 文件夹中的DLL在创建其C#项目时由Unity自动引用。这意味着可以在脚本中使用所有包含的代码。但请注意,相反的方法不会那么容易:您不能在单独的项目中使用Unity脚本中的代码。
根据您对CSharpCodeProvider的具体要求,您可以将生成逻辑(以及必要的Import
指令)放入这样一个单独的项目中。
编辑:有关我们如何设置项目结构的更多信息,您可以通过Unite11上的Jagged Alliance Online首席程序员观看this talk。
答案 1 :(得分:0)
正如Suigi建议的那样,我已经在.Net IDE(SharpDevelop)的帮助下创建了一个.dll文件,并将其复制到了'资产'统一的文件夹。
(How do i create a .dll file with SharpDevelop)
这是我编写的用于生成.dll文件的类:
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(...)。