Отредактировано, чтобы указать, что 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