VS'08 が動作する dll をコンパイルできないことを示すために編集されましたが、最初はできると言っていました
コンパイルに使用するツールに応じてコンパイル方法が異なる VB コードがあります。
Visual Studio '08、'10、および MSBuild 3.5 と 4 を使用して、いくつかの異なるコンピューターでこのコードをコンパイルしようとしました。動作する dll を生成します。MSBuild 3.5 と 4 の間で Vbc コマンド ライン パラメーターを比較しましたが、唯一の違いは (/nodstdlib、/sdkpath、/langversion:9) で、これらはすべて Vbc 4 で 3.5 互換の dll をコンパイルすることに関連しているようです。
壊れたバージョンでは、If ステートメント内のコードは、インスタンス メソッドへのデリゲートが null '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