我试图在代码中构建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时,尝试从代码构建它时会出现问题。
答案 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也可能与您有关。
如果您提供有关实际项目的更多信息,则可以轻松修复。现在,判断一切是如何建立的有点困难。