MSBuild 3.5 производит другой IL, чем MSBuild 4 для того же кода - PullRequest
1 голос
/ 28 июля 2010

Отредактировано, чтобы указать, что VS'08 не может скомпилировать рабочую dll, хотя я первоначально сказал, что это может

У нас есть фрагмент кода VB, который компилируется по-разному в зависимости от используемых инструментов.

Я пытался скомпилировать этот код на нескольких разных компьютерах, используя Visual Studio '08, '10 и MSBuild 3.5 и 4. MSBuild 3.5 (который использует наш сервер сборки) и VS'08 всегда производитсломанная dll, в то время как MSBuild4 / VS'10 выдает рабочую dll.Я сравнил параметры командной строки Vbc между MSBuild 3.5 и 4, единственными отличиями были (/ nodstdlib, / sdkpath, / langversion: 9), которые, похоже, связаны с тем, чтобы Vbc 4 компилировал dll, совместимую с 3.5.

ВНерабочая версия: код внутри оператора If выдает ошибку, говорящую о том, что Делегирование метода экземпляра не может иметь значение «this».

Фрагмент соответствующего кода:

Dim folders As SortedList(Of String, FolderInfo) = FolderManager.Instance.GetFoldersSorted(portalId)
Dim inventory As New List(Of FolderInventoryItem)

'create a FileSysItem for every folder
For Each folderItem In folders.Values
  Dim currentFolder = folderItem

  If (Not inventory.Any(Function(f) f.UniqueId = currentFolder.UniqueId)) Then
  ....

Используя Reflector для разборки IL на VB, рабочий dll содержит:

Dim foldersSorted As SortedList(Of String, FolderInfo) = ComponentBase(Of IFolderManager, FolderManager).Instance.GetFoldersSorted(portalId)
Dim source As New List(Of FolderInventoryItem)
Dim info As FolderInfo
For Each info In foldersSorted.Values
    Dim e$__ As _Closure$__2
    e$__ = New _Closure$__2(e$__) { _
        .$VB$Local_currentFolder = info _
    }
    If Not source.Any(Of FolderInventoryItem)(New Func(Of FolderInventoryItem, Boolean)(AddressOf e$__._Lambda$__6)) Then

Используя Reflector для разборки IL на VB, сломанный dll содержит:

Dim foldersSorted As SortedList(Of String, FolderInfo) = ComponentBase(Of IFolderManager, FolderManager).Instance.GetFoldersSorted(portalId)
Dim source As New List(Of FolderInventoryItem)
Dim info As FolderInfo
For Each info In foldersSorted.Values
    Dim e$__ As _Closure$__2
    Dim e$__2 As _Closure$__3
    e$__ = New _Closure$__2(e$__) { _
        .$VB$Local_currentFolder = info _
    }
    If Not source.Any(Of FolderInventoryItem)(New Func(Of FolderInventoryItem, Boolean)(AddressOf e$__2._Lambda$__6)) Then

1 Ответ

1 голос
/ 29 июля 2010

Скотт,

Компилятор Visual Basic и команды MSBuild изучают проблему, которую вы описали, но не можете ее воспроизвести. Можете ли вы воспроизвести эту проблему с небольшим проектом, возможно, с одним файлом кода? Эта проблема возникает при сборке с MSBuild 3.5 на рабочей станции разработки или только на сервере сборки? Это влияет на все лямбды или только на эту? Если вы переместили этот код в другой метод или изменили его немного, он все равно будет построен неправильно?

Если вам неудобно делиться какой-либо дополнительной информацией о вашем проекте, вы можете сообщить об этом как об ошибке по адресу http://connect.microsoft.com/visualstudio, и мы сможем проконсультироваться в частном порядке.

С уважением,

Энтони Д. Грин | Руководитель программы | Компилятор Visual Basic

...