对于相同的代码,MSBuild 3.5产生与MSBuild 4不同的IL

时间:2010-07-27 21:24:30

标签: .net msbuild compilation vbc

编辑表示VS'08无法编译工作dll,虽然我原来说它可以

我们有一段VB代码,根据用于编译它的工具进行不同的编译。

我尝试使用Visual Studio '08,'10和MSBuild 3.5和4在几台不同的计算机上编译此代码.MSBuild 3.5(我们的构建服务器使用)和VS'08总是生成一个损坏的dll,而MSBuild4 / VS'10生成一个工作dll。我比较了MSBuild 3.5和4之间的Vbc命令行参数,唯一的区别是(/ nodstdlib,/ sdkpath,/ langversion:9),它们都与使Vbc 4编译3.5兼容的dll有关。

在破坏的版本中,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 个答案:

答案 0 :(得分:1)

斯科特,

Visual Basic编译器和MSBuild团队正在调查您所描述的问题,但无法复制它。你能用一个可能只有一个代码文件的小项目重现这个问题吗?在开发工作站上或仅在构建服务器上使用MSBuild 3.5构建时,是否存在此问题?它会影响所有lambdas还是仅影响这个?如果您将此代码移动到其他方法或稍微更改它仍会构建错误?

如果您不愿意分享有关项目的任何其他信息,可以在http://connect.microsoft.com/visualstudio将此报告为错误,我们可以私下跟进。

此致

Anthony D. Green |项目经理| Visual Basic编译器