【问题标题】:No Silverlight project specified for Silverlight output没有为 Silverlight 输出指定 Silverlight 项目
【发布时间】:2023-03-20 11:25:01
【问题描述】:

我有一个在 ASP.NET 主机下运行的非常标准的 silverlight 应用程序。在所有开发机器上它都编译得很好,但在我们的 CI 服务上,我们得到了这个错误:

没有为 Silverlight 输出指定 Silverlight 项目

但是如果我登录 CI 并使用 VS2010 手动编译它就可以正常工作!这是 Silverlight 4,.NET 4.0

【问题讨论】:

标签: silverlight


【解决方案1】:

因为我花了 2 天时间试图弄清楚为什么在我从事的 Silverlight 项目中会发生这种情况,所以我想我会把它贴在这里。

在我的情况下,问题是由于网站 .csproj 中的一个 的项目 GUID 与项目的实际 GUID 不匹配(由于之前发生的代码重组)引起的。

这与 silverlight 应用程序或其任何设置无关。我不知道为什么,但不知何故,这个错误的引用会导致“CopyFilesToFolders”MSBuild 任务在“SourceFiles”列表中多次列出相同的文件。这会导致第一组副本成功,然后出现一组“未指定 Silverlight 项目”错误。

只需删除错误的项目引用并重新添加它即可修复 GUID 并解决构建问题。

确实是一个非常非常糟糕的错误消息。

【讨论】:

  • 非常感谢您发布此信息!我创建了一个 PowerShell 脚本来查找错误的项目引用(请参阅我的答案)。
【解决方案2】:

感谢 MerickOWA 在这里发帖,我确信它为我解决了同样的问题节省了几个小时。

我创建了一个 PowerShell 脚本来查找解决方案中所有项目的不匹配 GUID。它可能会为其他人节省更多时间。

要运行它,请将以下代码复制到与解决方案相同的文件夹中的文本文件中,重命名为 .ps1,启动 Powershell 控制台,导航到包含您的解决方案的文件夹,然后运行脚本。它将列出不匹配的项目引用(如果有)。

要修复,请在 Visual Studio 中打开解决方案,然后删除并重新添加不匹配的项目引用。

function validateSolution([string]$slnFileName) {

    "Validating solution: " + $slnFileName

    # Extract all the c# projects from the solution file
    $solutionProjects = 
        Get-Content $slnFileName | Select-String 'Project\(' | ForEach-Object {
            $projectParts = $_ -Split '[,=]' ;
            New-Object PSObject -Property @{
                Kind = $projectParts[0].Replace('Project("', '').Replace('") ','');
                Name = $projectParts[1].Trim('" ');
                File = $projectParts[2].Trim('" ');
                Guid = $projectParts[3].Trim('" ');
            }; 
        } | Where-Object { $_.Kind -eq "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}" } # Kind = C# project

    # Output list of C# projects to console
    # $solutionProjects

    # Create HashTable keyed on project GUID
    $solutionProjectGuids = @{}
    foreach ($project in $solutionProjects) {
        $solutionProjectGuids.Add($project.Guid, $project)
    }

    # Loop through each c# project in the solution
    foreach ($project in $solutionProjects) {
        [xml]$projectXml = Get-Content $project.File
        $projectReferences = $projectXml.Project.ItemGroup | Where-Object { $_.ProjectReference -ne $null }

        # Loop through each ProjectReference
        foreach($reference in $projectReferences.ChildNodes | Where-Object { $_.Project -ne $null } ) {
            # Check the project reference GUID exists in hash table of project GUIDS; if not write error
            if (!$solutionProjectGuids.ContainsKey($reference.Project)) {
                ""
                "Bad ProjectReference: Project GUID not found in solution " 
                "Solution:  " + $slnFileName
                "Project:   " + $project.File
                "Reference: " + $reference.Name
                "Bad GUID:  " + $reference.Project
            }
        }
    }
    "Completed solution:  " + $slnFileName
}

foreach ($solutionFile in ls *.sln) {
    validateSolution $solutionFile
}

【讨论】:

  • 我发现以下站点在修改此脚本时很有用。 mztools.com/articles/2008/mz2008017.aspx 另请注意,解决方案文件夹的种类指南是“{2150E333-8FDC-42A3-9474-1A3956D46DE8}”。
  • 谢谢你,你的脚本对我找到不好的参考很有用。
【解决方案3】:

如果您查看构建服务器生成的日志文件,您可能会看到类似这样的内容...

CopySilverlightApplications:
  Copying Silverlight applications
  Copying <Path>.xap to <Path>.xap
MSBUILD : error : Copying file <Path>.xap failed. No Silverlight project specified for Silverlight output <Path>.xap. [<Path>.csproj]

CopySilverlightApplications 是在以下文件中定义的目标。

C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets

它包含这个条件,它解释了为什么您在使用 Visual Studio 构建时没有遇到问题。

Condition="'$(BuildingInsideVisualStudio)' != 'true'"

我有两个构建定义,每个定义构建不同的配置。其中一个版本还可以(发布),但另一个(每晚)存在您描述的问题。当我使用 XML 编辑器查看 silverlight 应用程序的项目文件时,我看到虽然有一个属性组的条件对于 Release 评估为 true,但对于 Nightly 却没有。

我通过获取 Release 属性组的副本手动编辑了文件,并调整了条件和 OutputPath 以适应 Nightly 构建。 这解决了问题。

我后来注意到,如果我在 Visual Studio 中导航到 Silverlight 项目的“属性”页面并使用工具栏中的下拉菜单切换到 Nightly 配置,则会自动为该配置生成一个新的 PropertyGroup 元素。 这也可能解决问题。

【讨论】:

    【解决方案4】:

    我遇到了同样的问题。该项目在调试和发布配置中构建得很好,但我在 web 项目中得到“没有为 Silverlight 输出指定的 Silverlight 项目”。我还注意到它试图从 ./bin/Release/ 而不是 ./bin/Production/ 复制 .​​xap 文件。

    从 web 项目中删除所有 Silverlight 应用程序(项目属性中的选项卡)并将 ClientBin 文件夹添加为输出路径(建议 here)后,我收到了更好的错误消息。问题是 web-project 引用的一些项目缺少选定的配置。添加配置后,我可以再次将 Silverlight 应用程序添加到 Web 项目并将输出路径返回到 bin/$(Configuration)/ 并仍然构建解决方案。

    【讨论】:

      【解决方案5】:

      我似乎在 CopySilverlightApplications 任务中生成了重复的 xap 文件名,这导致了此错误。我能够通过对以下文件进行以下修改来解决此问题。请注意新 ItemGroup 的引入以及 CopyFilesToFolders 任务中 SourceFiles 属性对其的引用。

      C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets

      <ItemGroup>
          <_UniqueSilverlightXapFiles Include="%(_SilverlightXapFiles.FullPath)" />
      </ItemGroup>
      
      <!--Copy the outputs to the target folder-->
      <CopyFilesToFolders SourceFiles="@(_UniqueSilverlightXapFiles)" 
                          SilverlightApplications="@(_SilverlightApplications)" 
                          ConfigName="$(Configuration)"  
                          Condition="'@(_SilverlightXapFiles)' != ''">
        <Output TaskParameter="DestinationFiles" ItemName="_WebApplicationSilverlightXapFiles" />      
      </CopyFilesToFolders>
      

      【讨论】:

        【解决方案6】:

        为了进一步混淆这个问题,我在我们现有的解决方案中添加了 2 个新项目(一个新库及其关联的测试项目),并且 CI 构建失败并出现 no silverlight project specified for silverlight output error,它在 2 天前成功。 2 个新项目没有其他项目正在使用的配置。

        通过解决方案配置管理器将缺少的配置添加到 2 个新项目中修复了它。

        为什么这会影响与这两个新项目无关的 Silverlight 项目,我不知道。

        【讨论】:

          【解决方案7】:

          我遇到了同样的问题。我正在制作构建脚本,在解决方案上运行 msbuild。 我在 "Test" 配置中构建解决方案,但引用 Silverlight 项目的 Web 项目一直在目标 bin\Release 文件夹中查找二进制文件。 我尝试重新添加 Silverlight 项目,问题仍然存在。

          原来问题是在 msbuild 参数中指定 Platform。 解决方案配置"Test|AnyCPU""Test|MixedPlatform" 不一样。您会发现ConfigurationPlatform 必须等于项目文件中定义的同一对。我不知道 Platform 默认情况下 msbuild 采用什么,但我知道它跳转到了 Release 文件夹。

          无论如何,我在 msbuild 参数中添加了 /p:Platform="Any CPU"

          【讨论】:

            【解决方案8】:

            在仔细检查了为 CI 构建的配置后,我发现我的 Web 项目引用的其中一个项目被设置为使用错误的配置构建。我的 CI 构建被设置为为 Staging (Any CPU) 构建,而我的一个被 Web 项目引用的 .projects 被设置为使用 Release 配置构建.一旦我将配置更新为暂存,CI 构建成功完成

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-05-26
              • 1970-01-01
              • 2012-03-14
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多