加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在没有安装Visual Studio的情况下以编程方式创建csproj

发布时间:2020-12-16 02:02:23 所属栏目:百科 来源:网络整理
导读:我试图使用MSBuild命名空间以编程方式生成.csproj文件,但缺少代码示例使得这个过程变得繁琐且容易出错. 到目前为止,我有以下代码,但我不知道如何将类,引用等添加到项目中. public void Build(){ string projectFile = string.Format(@"{0}{1}.csproj",Commo
我试图使用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创建proj文件,则必须使用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生成的proj文件的上下文中有意义.除非您按照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);
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读