如何使用MSBuild 14从C#编译XNA项目?

时间:2016-03-07 01:57:32

标签: c# msbuild

我有一个XNA项目,我在Visual Studio 2015中编译得非常好,它利用了C#6的功能。

以前,我有一些用C#编码的工具,当它在VS 2013下使用C#5时会自动编译项目,但是对C#6的更改已经破坏了某些东西。

为了重现这一点,我创建了一个新的控制台应用程序,引用了来自Microsoft.Build的{​​{1}},Microsoft.Build.FrameworkMicrosoft.Build.Utilities.Core程序集。

然后我使用以下代码创建了我的C#编译器项目:

C:\Program Files (x86)\MSBuild\14.0\Bin

不幸的是,当这次运行时,我收到以下错误:

  

错误:文件C:\ Program Files(x86)\ MSBuild \ Microsoft \ XNA Game Studio \ v4.0 \ Microsoft.Xna.GameStudio.ContentPipeline.targets第78行消息“BuildContent”任务无法从实例中实例化程序集“Microsoft.Xna.Framework.Content.Pipeline,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = 842cf8be1de50553”。请验证是否使用与计算机上安装的Microsoft.Build.Framework程序集相同的Microsoft.Build.Framework程序集版本构建了任务程序集,并确保主机应用程序没有缺少Microsoft.Build.Framework的绑定重定向。无法将“Microsoft.Xna.Framework.Content.Pipeline.Tasks.BuildContent”类型的对象强制转换为“Microsoft.Build.Framework.ITask”。

当我成功编译我的XNA项目时,我尝试在Visual Studio 2015中查看构建输出的详细信息,但即使使用详细日志记录,我发现(看似)相关的是:

namespace CompileXna
{
    class Program
    {
        static void Main(string[] args)
        {
            const string solutionPath = @"D:\Code\My Projects\FrbTest\FrbTest.sln";

            var properties = new Dictionary<string, string>()
            {
                {"Configuration", "Debug"},
                {"Platform", "x86" }
            };

            var parameters = new BuildParameters
            {
                Loggers = new ILogger[] {new BuildLogger()}
            };

            var request = new BuildRequestData(solutionPath, properties, null, new string[] {"Build"}, null);
            var manager = BuildManager.DefaultBuildManager.Build(parameters, request);

            Console.WriteLine("Done");
            Console.ReadLine();
        }
    }

    class BuildLogger : Logger
    {
        public override void Initialize(IEventSource eventSource)
        {
            eventSource.ErrorRaised += (sender, args) =>
                Console.WriteLine($"Error: File {args.File} line {args.LineNumber} message {args.Message}");

            eventSource.WarningRaised += (sender, args) =>
                Console.WriteLine($"Warning: File {args.File} line {args.LineNumber} message {args.Message}");
        }
    }
}

任何人都有这方面的成功吗?

0 个答案:

没有答案