【问题标题】:MSBuild 3.5 produces different IL than MSBuild 4 for the same code对于相同的代码,MSBuild 3.5 生成的 IL 与 MSBuild 4 不同
【发布时间】:2010-07-27 21:24:29
【问题描述】:

已编辑以表明 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 语句中的代码会抛出一个错误,提示 委托给实例方法不能有 null 'this'。

一个sn-p的相关代码是:

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

【问题讨论】:

  • 是的,看到他们修复 bugz 真是太棒了。
  • @Hans,我怀疑这是 3.5 中的一个错误,除了 Visual Studio '08 可以编译此代码并生成一个工作 dll。这似乎是一个只影响使用 MSBuild 的构建的错误。

标签: .net msbuild compilation vbc


【解决方案1】:

斯科特,

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

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

问候,

安东尼·D·格林 |项目经理 | Visual Basic 编译器

【讨论】:

  • 在我们尝试过的所有计算机上使用 MSBuild 3.5 时都会出现此问题。这是唯一受影响的 lambda,程序集中还有许多其他 lambda。我将尝试创建一个具有相同问题的简化版本。
  • @Anothony D. Green 我已经在connect.microsoft.com/VisualStudio/feedback/details/581743/… 提交了一个关于连接的问题我无法以更简单的方式重现这个问题,如果需要,我们可以在那里私下共享 dll 的源代码。
猜你喜欢
  • 1970-01-01
  • 2021-09-11
  • 2013-11-18
  • 2015-03-19
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多