簡體   English   中英

“ GetReferenceNearestTargetFrameworkTask”任務已聲明或使用不正確

[英]The “GetReferenceNearestTargetFrameworkTask” task has been declared or used incorrectly

上面的錯誤發生在執行以下測試的測試項目中的VS 2017 15.5.2中。 在test.vbproj文件中有綁定重定向,但msbuild沒有。

    <TestMethod()> Public Sub ElementTypeUnitTestAsync()
       Dim RoslynPath As String = Path.Combine(RepoPath, SolutionPartialPath)

        Dim MS_Workspace As MSBuildWorkspace = MSBuildWorkspace.Create()
        AddHandler MS_Workspace.WorkspaceFailed, Sub(sender As Object, e As WorkspaceDiagnosticEventArgs)
                                                     Debug.WriteLine(e.Diagnostic.ToString())
                                                 End Sub
        Dim NewSolution As Solution = MS_Workspace.OpenSolutionAsync(RoslynPath).Result
    End Sub

整個信息是

[失敗]處理文件'C:\\ Repos \\ roslyn-master \\ src \\ Samples \\ CSharp \\ APISampleUnitTests \\ APISampleUnitTestsCS.csproj'時,Msbuild失敗,消息為:C:\\ Program Files(x86)\\ Microsoft Visual Studio \\ 2017 \\ Enterprise \\ MSBuild \\ 15.0 \\ Bin \\ Microsoft.Common.CurrentVersion.targets:(1601、5):無法從程序集“ C:\\ Program Files(x86)\\ Microsoft Visual Studio \\ 2017 \\ Enterprise”實例化“ GetReferenceNearestTargetFrameworkTask”任務\\ Common7 \\ IDE \\ CommonExtensions \\ Microsoft \\ NuGet \\ NuGet.Build.Tasks.dll”。 請驗證該任務程序集是使用與計算機上安裝的版本相同的Microsoft.Build.Framework程序集構建的,並且您的主機應用程序沒有缺少Microsoft.Build.Framework的綁定重定向。 無法將類型為“ NuGet.Build.Tasks.GetReferenceNearestTargetFrameworkTask”的對象轉換為類型為“ Microsoft.Build.Framework.ITask”的對象。 C:\\ Program Files(x86)\\ Microsoft Visual Studio \\ 2017 \\ Enterprise \\ MSBuild \\ 15.0 \\ Bin \\ Microsoft.Common.CurrentVersion.targets:(1601,5):``GetReferenceNearestTargetFrameworkTask''任務已被聲明或使用不正確,或者施工期間失敗。 檢查任務名稱和程序集名稱的拼寫。

如果超過1個,此代碼將允許選擇VS實例

Imports Microsoft.Build.Locator

Public Class VS_Selector_Dialog1
    Private m_instance As VisualStudioInstance = Nothing
    Private SelectedRow As Integer = -1
    Private visualStudioInstances() As VisualStudioInstance = MSBuildLocator.QueryVisualStudioInstances().ToArray()
    Public ReadOnly Property MSBuildInstance As VisualStudioInstance
        Get
            Return m_instance
        End Get
    End Property

    Private Sub Cancel_Button_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Cancel_Button.Click
        DialogResult = DialogResult.Cancel
        Close()
    End Sub

    Private Sub DataGridView1_SelectionChanged(sender As Object, e As EventArgs) Handles DataGridView1.SelectionChanged
        m_instance = visualStudioInstances(DataGridView1.CurrentRow.Index)
    End Sub

    Private Sub OK_Button_Click(ByVal sender As Object, ByVal e As EventArgs) Handles OK_Button.Click
        If m_instance Is Nothing Then
            Exit Sub
        End If
        DialogResult = DialogResult.OK
        Close()
    End Sub

    Private Sub VS_Selector_Dialog1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim BestIndex As Integer = -1
        Text = "Multiple installs of MSBuild detected please select one:"
        Dim InstanceTable As New DataTable
        InstanceTable.Columns.Add("InstanceNumber")
        InstanceTable.Columns.Add("Edition")
        InstanceTable.Columns.Add("Version")
        InstanceTable.Columns.Add("MSBuildPath")
        For Index As Integer = 0 To visualStudioInstances.Length - 1
            If visualStudioInstances(Index).Name.Contains(" Build ") Then
                Continue For
            End If
            BestIndex = Index
            Dim rowToAdd As DataRow = InstanceTable.NewRow()
            rowToAdd("InstanceNumber") = Index + 1
            rowToAdd("Edition") = visualStudioInstances(Index).Name
            rowToAdd("Version") = visualStudioInstances(Index).Version
            rowToAdd("MSBuildPath") = visualStudioInstances(Index).MSBuildPath
            InstanceTable.Rows.Add(rowToAdd)
        Next
        DataGridView1.DataSource = InstanceTable
        If InstanceTable.Rows.Count = 1 Then
            m_instance = visualStudioInstances(BestIndex)
            DialogResult = DialogResult.OK
            Close()
        End If
     End Sub
End Class

讓用戶選擇實例,或者您選擇“最佳”實例

If VS_Selector_Dialog1.ShowDialog(Me) <> DialogResult.OK Then
    Stop
End If

一旦擁有正確的實例,MSBuild將可以正常工作

Console.WriteLine($"Using MSBuild at '{VS_Selector_Dialog1.MSBuildInstance.MSBuildPath}' to load projects.")
' NOTE: Be sure to register an instance with the MSBuildLocator
'       before calling MSBuildWorkspace.Create()
'       otherwise, MSBuildWorkspace won't MEF compose.
MSBuildLocator.RegisterInstance(VS_Selector_Dialog1.MSBuildInstance)
Using Workspace As MSBuildWorkspace = MSBuildWorkspace.Create()
    AddHandler Workspace.WorkspaceFailed, AddressOf MSBuildWorkspaceFailed
    Dim currentProject As Project = Workspace.OpenProjectAsync(.FileName).Result
    Workspace.LoadMetadataForReferencedProjects = True
    If currentProject.HasDocuments Then
        For Each document As Document In currentProject.Documents

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM