【发布时间】: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