从代码构建WP8.0程序集

时间:2014-08-24 15:12:09

标签: msbuild visual-studio-2013 windows-phone

我试图在代码中构建WP 8.0项目。我使用Project类和Build方法,源代码可用here

使用VS 2012在Windows 8上运行的代码,但是当我升级到Windows 8.1和VS2013时,它停止了工作。我知道微软在VS中改变并删除了.NET中的Build框架,但我仍然不确定它为什么会发生,我该如何修复它。

错误:

  

C:\ Program Files   (86)\的MSBuild \微软\的WindowsPhone \ 8.0 \ Microsoft.WindowsPhone.Common.targets(75,5):   错误MSB4127:" GetSilverlightFrameworkPath"任务不可能   从程序集" C:\ Program Files实例化   (86)\的MSBuild \微软\的WindowsPhone \ V8.0 \ Microsoft.Silverlight.WindowsPhone.Build.Tasks.dll&#34 ;.   请验证是否已使用相同版本构建任务程序集   Microsoft.Build.Framework程序集作为您安装的程序集   计算机和您的主机应用程序没有错过绑定   重定向到Microsoft.Build.Framework。无法转换类型的对象   ' Microsoft.Silverlight.Build.Tasks.GetSilverlightFrameworkPath'至   键入' Microsoft.Build.Framework.ITask' .C:\ Program Files   (86)\的MSBuild \微软\的WindowsPhone \ 8.0 \ Microsoft.WindowsPhone.Common.targets(75,5):   错误MSB4060:" GetSilverlightFrameworkPath"任务已经   声明或使用不正确,或在施工期间失败。检查   拼写任务名称和程序集名称。

更新: 顺便说一句,使用VS2013编译WP 8.0时,尝试从代码构建它时会出现问题。

1 个答案:

答案 0 :(得分:0)

您收到此错误是因为Microsoft.Silverlight.WindowsPhone.Build.Tasks.dll是包含GetSilverlightFrameworkPath的程序集,例如在Silverlight 4和5 SDK中:

// Decompiled with JetBrains decompiler
// Type: Microsoft.Silverlight.Build.Tasks.GetSilverlightFrameworkPath
// Assembly: Microsoft.Silverlight.Build.Tasks, Version=9.3.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// MVID: 2E9B62C4-1C0C-4AAD-8CBE-F7E074602879
// Assembly location: C:\Program Files (x86)\MSBuild\Microsoft\Silverlight\v5.0

//omitted for brevity

namespace Microsoft.Silverlight.Build.Tasks
{
  public sealed class GetSilverlightFrameworkPath : Task
  {
    private const string SDKAssemblyFoldersExRegKey = "v5.0\\AssemblyFoldersEx";
    public const string SDKLibrariesRegKey = "v5.0\\AssemblyFoldersEx\\Silverlight SDK Client Libraries";
    public const string SDKRuntimeInstallPathRegKey = "SOFTWARE\\Microsoft\\Microsoft SDKs\\Silverlight\\v5.0\\ReferenceAssemblies";

    public string RegistryBase { get; set; }

    public string SilverlightPath { get; set; }

    public string[] SilverlightSDKPaths { get; set; }

    public string SilverlightRuntimeVersion { get; set; }

    public override bool Execute()
    {
      //omitted for brevity
    }

    private string GetSilverlightPath()
    {
      //omitted for brevity
    }

    private string GetSDKRuntimeVersion()
    {
      //omitted for brevity
    }

    private string[] GetAllSilverlightSDKPaths()
    {
      //omitted for brevity
    }
  }
}

然而,它在WP v8.0中的实现确实有很大不同:

// Decompiled with JetBrains decompiler
// Type: Microsoft.Silverlight.Build.Tasks.GetSilverlightFrameworkPath
// Assembly: Microsoft.Silverlight.WindowsPhone.Build.Tasks, Version=9.3.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// MVID: 899BFFD0-786C-472A-8935-576EED0F4F90
// Assembly location: C:\Program Files (x86)\MSBuild\Microsoft\WindowsPhone\v8.0\Microsoft.Silverlight.WindowsPhone.Build.Tasks.dll

//omitted for brevity

namespace Microsoft.Silverlight.Build.Tasks
{
  public sealed class GetSilverlightFrameworkPath : Task
  {
    public string RegistryBase { get; set; }

    public string RuntimePathRegistryKey { get; set; }

    public string RuntimeVersionRegistryKey { get; set; }

    public string AdditionalRegistryBasePaths { get; set; }

    public string SilverlightPath { get; set; }

    public string[] SilverlightSDKPaths { get; set; }

    public string SilverlightRuntimeVersion { get; set; }

    public override bool Execute()
    {
         // omitted for brevity
    }

    private string GetSilverlightPath()
    {
      // omitted for brevity
    }

    private string GetSDKRuntimeVersion()
    {
      // omitted for brevity
    }

    internal string[] GetAllSilverlightSDKPaths()
    {
      // omitted for brevity
    }
}

因此,事情不起作用是很自然的。

您需要做的是检查您是否在所有项目中引用了相同的SDK版本。

您在构建期间尝试实例化的任务是在SL SDK 5中,而目前由于某种原因,构建过程正在尝试使用WP8.0 SDK。

此外,您引用的代码是references Toolset 12.0

的csproj的一部分
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

您确定需要吗?

This info也可能与您有关。

如果您提供有关实际项目的更多信息,则可以轻松修复。现在,判断一切是如何建立的有点困难。