C# 每次我重新加载项目时,unity中的Csproj文件都会更改

C# 每次我重新加载项目时,unity中的Csproj文件都会更改,c#,unity3d,msbuildcommunitytasks,C#,Unity3d,Msbuildcommunitytasks,我想更改unity项目的“csproj”文件,以便能够访问特定的库作为答案 我正在手动编辑该文件,但每次重新加载项目时,“csproj”文件都会返回其初始状态 这是一个普遍的问题吗?有没有办法避免这种情况并永久更改文件 编辑:我的目标是使用CSharpCodeProvider,因此,如果有其他方法可以在不更改“csproj”文件的情况下执行此操作,我很乐意采用这种方法据我所知,您无法阻止Unity在重新编译脚本时覆盖您的csproj文件 当使用较大的代码库和Unity3D时,我倾向于将大部分代

我想更改unity项目的“csproj”文件,以便能够访问特定的库作为答案

我正在手动编辑该文件,但每次重新加载项目时,“csproj”文件都会返回其初始状态

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



编辑:我的目标是使用CSharpCodeProvider,因此,如果有其他方法可以在不更改“csproj”文件的情况下执行此操作,我很乐意采用这种方法

据我所知,您无法阻止Unity在重新编译脚本时覆盖您的csproj文件

当使用较大的代码库和Unity3D时,我倾向于将大部分代码放入单独的.Net程序集(DLL)。这有助于我在多个项目和游戏服务器之间共享代码,而Unity在检测到更改时不需要编译所有脚本

为此,启动您选择的.NETIDE并创建一个新的类库项目(它将输出一个.dll)。确保它的目标是.Net Framework 3.5或更低版本。然后,在后期构建步骤中将output.dll复制到Unity项目的资产文件夹中。我喜欢使用后期构建步骤,以防止在更改后忘记复制程序集

Unity在创建C#项目时会自动引用项目资产文件夹中的DLL。这意味着所有包含的代码都可以在脚本中使用。但是请注意,另一种方法并不容易:您不能在单独的项目中使用Unity脚本中的代码

根据具体需要,您可以将生成逻辑(以及必要的
Import
指令)放入这样一个单独的项目中


编辑:有关我们如何设置项目结构的更多信息,您可以从Unite11的Jagged Alliance Online上观看首席程序员。

正如Suigi所建议的,我在.Net IDE()的帮助下创建了一个.dll文件,并将其复制到unity的“资产”文件夹中

()

下面是我为生成.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;
        }
    }
}
}

为了在任何unity脚本中使用它,只需使用名称空间“dllTest”。然后,您可以调用AssemblyGeneration.GenerateAsemblyFromCode(…)。

Unity在检测到代码更改时往往会重写这些文件,在这种情况下,这可能非常烦人。这种说法很好。Blackbird Interactive在中使用了类似的策略。非常感谢。这是一个易于实施且完全有效的解决方案。我将在这里发布我用来创建dll文件的代码作为答案,以防其他人想在他的Unity项目中使用CSharpCodeProvider对象。出于好奇,为什么需要在运行时编译代码?我正在尝试以游戏的形式为程序员创建一个学习平台,玩家需要实际编写代码才能玩游戏。因此,要编译的代码是由玩家在运行时编写的。这是一个有趣的想法。请注意,某些平台(iOS、Win-RT)禁止您及时编译代码。如果您想针对这些平台,您可能需要考虑通过集成脚本语言(如Lua)来实现。这还有一个好处,那就是你可以控制玩家实际能做什么,而不是允许他们基本上注入任意代码。谢谢,我会防御性地检查它,因为它可能会消除我的方法中可能存在的一些问题。