没有为Silverlight输出指定Silverlight项目

Dan*_*ams 9 silverlight

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

没有为Silverlight输出指定Silverlight项目

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

Mer*_*OWA 9

因为我花了两天时间试图弄清楚为什么在我工作的Silverlight项目中发生这种情况,我想我会在这里发布它.

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

这与silverlight应用程序或其任何设置无关.我不知道为什么,但不知何故,这个错误的引用导致"CopyFilesToFolders"MSBuild任务在"SourceFiles"列表中多次列出相同的文件.这会导致第一组copys成功,然后是一组"No Silverlight project specified"错误.

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

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


Edw*_*ard 6

感谢MerickOWA在这里发布,我相信它可以节省我同样的问题.

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

要运行它,下面的代码复制到一个文本文件在同一文件夹作为您的解决方案,重命名为.PS1,启动PowerShell控制台,导航到该文件夹​​包含您的解决方案,然后运行该脚本.它将列出错误匹配的项目引用(如果有).

要解决此问题,请在Visual Studio中打开解决方案,然后删除并重新添加不匹配的Project Reference(s).

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
}
Run Code Online (Sandbox Code Playgroud)