gpt4 book ai didi

c# - 在未安装 Visual Studio 的情况下以编程方式即时创建 csproj

转载 作者:行者123 更新时间:2023-11-30 14:10:20 35 4
gpt4 key购买 nike

我正在尝试使用 MSBuild 命名空间以编程方式生成一个 .csproj 文件,但由于缺少代码示例,因此这是一个乏味且容易出错的过程。

到目前为止,我得到了以下代码,但我不确定如何向项目添加类、引用等。

public void Build()
{
string projectFile = string.Format(@"{0}\{1}.csproj", Common.GetApplicationDataFolder(), _project.Target.AssemblyName);
Microsoft.Build.Evaluation.Project p = new Microsoft.Build.Evaluation.Project();

ProjectCollection pc = new ProjectCollection();

Dictionary<string, string> globalProperty = new Dictionary<string, string>();

globalProperty.Add("Configuration", "Debug");
globalProperty.Add("Platform", "x64");

BuildRequestData buildRequest = new BuildRequestData(projectFile, globalProperty, null, new string[] { "Build" }, null);

p.Save(projectFile);

BuildResult buildResult = BuildManager.DefaultBuildManager.Build(new BuildParameters(pc), buildRequest);
}

谢谢。

最佳答案

如果您真的想使用 MSBuild API 创建项目文件,则必须使用 Microsoft.Build.Construction 命名空间。您需要的大多数类型都在 Micrsoft.Build.dll 程序集中。创建具有一些属性和项组的项目文件的简短示例:

class Program
{
static void Main(string[] args)
{
var root = ProjectRootElement.Create();
var group = root.AddPropertyGroup();
group.AddProperty("Configuration", "Debug");
group.AddProperty("Platform", "x64");

// references
AddItems(root, "Reference", "System", "System.Core");

// items to compile
AddItems(root, "Compile", "test.cs");

var target = root.AddTarget("Build");
var task = target.AddTask("Csc");
task.SetParameter("Sources", "@(Compile)");
task.SetParameter("OutputAssembly", "test.dll");

root.Save("test.csproj");
Console.WriteLine(File.ReadAllText("test.csproj"));
}

private static void AddItems(ProjectRootElement elem, string groupName, params string[] items)
{
var group = elem.AddItemGroup();
foreach(var item in items)
{
group.AddItem(groupName, item);
}
}
}

请注意,这只是创建了 proj 文件。它不运行它。此外,“配置”和“平台”等属性仅在 Visual Studio 生成的项目文件的上下文中才有意义。除非您以 Visual Studio 自动执行的方式添加更多具有条件的属性组,否则它们实际上不会执行任何操作。

正如我在评论中指出的那样,我认为这是错误的处理方式。您真的只需要源代码的动态编译,这可以通过 CodeDom 获得:

using System.CodeDom.Compiler;

class Program
{
static void Main(string[] args)
{
var provider = CodeDomProvider.CreateProvider("C#");
string[] sources = {
@"public abstract class BaseClass { public abstract void Test(); }",
@"public class CustomGenerated : BaseClass { public override void Test() { System.Console.WriteLine(""Hello World""); } }"
};

var results = provider.CompileAssemblyFromSource(new CompilerParameters() {
GenerateExecutable = false,
ReferencedAssemblies = { "System.dll", "System.Core.dll" },
IncludeDebugInformation = true,
CompilerOptions = "/platform:anycpu"
}, sources);
if (results.Errors.Count > 0)
{
Console.WriteLine("{0} errors", results.Errors.Count);
foreach(CompilerError error in results.Errors)
{
Console.WriteLine("{0}: {1}", error.ErrorNumber, error.ErrorText);
}
}
else
{
var type = results.CompiledAssembly.GetType("CustomGenerated");
object instance = Activator.CreateInstance(type);
type.GetMethod("Test").Invoke(instance, null);
}
}
}

关于c# - 在未安装 Visual Studio 的情况下以编程方式即时创建 csproj,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24557807/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com