MSBuild 3.5 производит другой IL, чем MSBuild 4 для того же кода
Отредактировано, чтобы указать, что 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 выдает ошибку, говорящую о том, что Delegate для метода экземпляра не может иметь значение "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 ответ
Скотт,
Компилятор Visual Basic и команды MSBuild изучают описанную вами проблему, но не могут ее воспроизвести. Можете ли вы воспроизвести эту проблему с небольшим проектом, возможно, с одним файлом кода? Эта проблема возникает при сборке с MSBuild 3.5 на рабочей станции разработки или только на сервере сборки? Это влияет на все лямбды или только на эту? Если вы переместили этот код в другой метод или изменили его немного, он все равно будет построен неправильно?
Если вам неудобно делиться какой-либо дополнительной информацией о вашем проекте, вы можете сообщить об этом как об ошибке по адресу http://connect.microsoft.com/visualstudio и мы можем проконсультироваться в частном порядке.
С Уважением,
Энтони Д. Грин | Руководитель программы | Компилятор Visual Basic