每次重新加载项目时,团结的Csproj文件都会发生变化

时间:2015-06-16 20:17:50

标签: c# unity3d msbuildcommunitytasks

我想更改Unity项目的'csproj'文件,以便能够以this回答消息来访问特定的库。

我手动编辑文件,但每次重新加载项目时,'csproj'文件都会返回初始状态。

这是一个常见问题吗?有没有办法避免这种情况并永久更改文件?

编辑:我的目标是使用 CSharpCodeProvider ,所以如果有其他方法可以不改变'csproj'文件,我很乐意采用这种方法

2 个答案:

答案 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(...)。