Browse Source

Merge branch 'master' of https://github.com/icsharpcode/ILSpy into icons-refresh

pull/1704/head
Siegfried Pammer 7 years ago
parent
commit
ccd8311909
  1. 2
      DecompilerNuGetDemos.workbook
  2. 4
      ICSharpCode.Decompiler.Console/ICSharpCode.Decompiler.Console.csproj
  3. 2
      ICSharpCode.Decompiler.PowerShell/ICSharpCode.Decompiler.PowerShell.csproj
  4. 6
      ICSharpCode.Decompiler.Tests/ILPrettyTestRunner.cs
  5. 4
      ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs
  6. 2
      ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue1389.cs
  7. 15
      ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue1681.cs
  8. 42
      ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue1681.il
  9. 8
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/VariableNaming.cs
  10. 8
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/VariableNamingWithoutSymbols.cs
  11. 2
      ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs
  12. 5
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs
  13. 27
      ICSharpCode.Decompiler/CSharp/Transforms/DeclareVariables.cs
  14. 20
      ICSharpCode.Decompiler/DecompilerSettings.cs
  15. 2
      ICSharpCode.Decompiler/IL/Transforms/AssignVariableNames.cs
  16. 2
      ILSpy.AddIn/Commands/OpenReferenceCommand.cs
  17. 16
      ILSpy.Package/ILSpy.Package.wapproj
  18. BIN
      ILSpy.Package/Images/StoreLogo.backup.png
  19. 2
      ILSpy.Package/Package-CI.appxmanifest
  20. 2
      ILSpy.Package/Package-Local.appxmanifest
  21. 6
      ILSpy.Package/Package.appxmanifest
  22. 96
      ILSpy.WithPackage.sln
  23. 13
      ILSpy/Analyzers/Builtin/EventImplementsInterfaceAnalyzer.cs
  24. 12
      ILSpy/Analyzers/Builtin/EventOverriddenByAnalyzer.cs
  25. 13
      ILSpy/Analyzers/Builtin/MethodImplementsInterfaceAnalyzer.cs
  26. 13
      ILSpy/Analyzers/Builtin/MethodOverriddenByAnalyzer.cs
  27. 13
      ILSpy/Analyzers/Builtin/PropertyImplementsInterfaceAnalyzer.cs
  28. 12
      ILSpy/Analyzers/Builtin/PropertyOverriddenByAnalyzer.cs
  29. 5
      ILSpy/ILSpy.csproj
  30. 221
      ILSpy/MainWindow.xaml.cs
  31. 2
      ILSpy/Properties/AssemblyInfo.template.cs
  32. 9
      ILSpy/Properties/Resources.Designer.cs
  33. 3
      ILSpy/Properties/Resources.resx
  34. 4
      README.md
  35. 2
      azure-pipelines.yml
  36. 2
      global.json

2
DecompilerNuGetDemos.workbook

@ -6,7 +6,7 @@ platforms:
- DotNetCore - DotNetCore
packages: packages:
- id: ICSharpCode.Decompiler - id: ICSharpCode.Decompiler
version: 5.0.0.5066-preview4 version: 5.0.0.5124
--- ---
Setup: load the references required to work with the decompiler Setup: load the references required to work with the decompiler

4
ICSharpCode.Decompiler.Console/ICSharpCode.Decompiler.Console.csproj

@ -7,7 +7,7 @@
<PackAsTool>true</PackAsTool> <PackAsTool>true</PackAsTool>
<AssemblyName>ilspycmd</AssemblyName> <AssemblyName>ilspycmd</AssemblyName>
<ToolCommandName>ilspycmd</ToolCommandName> <ToolCommandName>ilspycmd</ToolCommandName>
<Version>5.0.0-preview4</Version> <Version>5.0.0.5124</Version>
<Description>Command-line decompiler using the ILSpy decompilation engine</Description> <Description>Command-line decompiler using the ILSpy decompilation engine</Description>
<Copyright>Copyright 2011-2019 AlphaSierraPapa</Copyright> <Copyright>Copyright 2011-2019 AlphaSierraPapa</Copyright>
<PackageProjectUrl>https://github.com/icsharpcode/ILSpy/</PackageProjectUrl> <PackageProjectUrl>https://github.com/icsharpcode/ILSpy/</PackageProjectUrl>
@ -28,7 +28,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="McMaster.Extensions.CommandLineUtils" Version="2.3.2" /> <PackageReference Include="McMaster.Extensions.CommandLineUtils" Version="2.3.2" />
<PackageReference Include="ICSharpCode.Decompiler" Version="5.0.0.5066-preview4" /> <PackageReference Include="ICSharpCode.Decompiler" Version="5.0.0.5124" />
<PackageReference Include="System.IO.FileSystem.Primitives" Version="4.3.0" /> <PackageReference Include="System.IO.FileSystem.Primitives" Version="4.3.0" />
<PackageReference Include="System.Runtime.Handles" Version="4.3.0" /> <PackageReference Include="System.Runtime.Handles" Version="4.3.0" />

2
ICSharpCode.Decompiler.PowerShell/ICSharpCode.Decompiler.PowerShell.csproj

@ -8,7 +8,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="PowerShellStandard.Library" Version="5.1.0" /> <PackageReference Include="PowerShellStandard.Library" Version="5.1.0" />
<PackageReference Include="ICSharpCode.Decompiler" Version="5.0.0.5066-preview4" /> <PackageReference Include="ICSharpCode.Decompiler" Version="5.0.0.5124" />
</ItemGroup> </ItemGroup>
</Project> </Project>

6
ICSharpCode.Decompiler.Tests/ILPrettyTestRunner.cs

@ -154,6 +154,12 @@ namespace ICSharpCode.Decompiler.Tests
Run(); Run();
} }
[Test]
public void Issue1681()
{
Run();
}
[Test] [Test]
public void Issue1454() public void Issue1454()
{ {

4
ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs

@ -284,7 +284,9 @@ namespace ICSharpCode.Decompiler.Tests
[Test] [Test]
public void VariableNamingWithoutSymbols([ValueSource(nameof(defaultOptions))] CompilerOptions cscOptions) public void VariableNamingWithoutSymbols([ValueSource(nameof(defaultOptions))] CompilerOptions cscOptions)
{ {
RunForLibrary(cscOptions: cscOptions, decompilerSettings: new DecompilerSettings { UseDebugSymbols = false }); var settings = Tester.GetSettings(cscOptions);
settings.UseDebugSymbols = false;
RunForLibrary(cscOptions: cscOptions, decompilerSettings: settings);
} }
[Test] [Test]

2
ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue1389.cs

@ -12,7 +12,7 @@ namespace Issue1389
private static void UnusedResultOfIsinst() private static void UnusedResultOfIsinst()
{ {
bool flag = GetObject() is TypeCode; _ = (GetObject() is TypeCode);
} }
private static bool BoolResultOfIsinst() private static bool BoolResultOfIsinst()

15
ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue1681.cs

@ -0,0 +1,15 @@
namespace ICSharpCode.Decompiler.Tests.TestCases.ILPretty
{
internal class BaseClass
{
public int importsClausePosition;
}
internal class Issue1681 : BaseClass
{
public void Test()
{
_ = importsClausePosition;
}
}
}

42
ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue1681.il

@ -0,0 +1,42 @@
// Metadata version: v4.0.30319
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0
}
.assembly ConsoleApp11
{
.ver 1:0:0:0
}
.module ConsoleApp11.exe
// MVID: {B973FCD6-A9C4-48A9-8291-26DDC248E208}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00020003 // ILONLY 32BITPREFERRED
// Image base: 0x000001C4B6C90000
.class private auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.ILPretty.BaseClass
extends [mscorlib]System.Object
{
.field public int32 importsClausePosition
}
.class private auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.ILPretty.Issue1681
extends ICSharpCode.Decompiler.Tests.TestCases.ILPretty.BaseClass
{
.method public hidebysig instance void Test() cil managed
{
// Code size 18 (0x12)
.maxstack 8
ldarg.0
ldfld int32 class ICSharpCode.Decompiler.Tests.TestCases.ILPretty.BaseClass::importsClausePosition
pop
ret
} // end of method Issue1681::Test
}

8
ICSharpCode.Decompiler.Tests/TestCases/Pretty/VariableNaming.cs

@ -10,12 +10,20 @@
private void Test(string text, C c) private void Test(string text, C c)
{ {
#if ROSLYN
_ = c.Name;
#else
string name = c.Name; string name = c.Name;
#endif
} }
private void Test2(string text, C c) private void Test2(string text, C c)
{ {
#if ROSLYN
_ = c.Text;
#else
string text2 = c.Text; string text2 = c.Text;
#endif
} }
} }
} }

8
ICSharpCode.Decompiler.Tests/TestCases/Pretty/VariableNamingWithoutSymbols.cs

@ -10,12 +10,20 @@
private void Test(string text, C c) private void Test(string text, C c)
{ {
#if ROSLYN
_ = c.Name;
#else
string name = c.Name; string name = c.Name;
#endif
} }
private void Test2(string text, C c) private void Test2(string text, C c)
{ {
#if ROSLYN
_ = c.Text;
#else
string text2 = c.Text; string text2 = c.Text;
#endif
} }
} }
} }

2
ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs

@ -1164,6 +1164,8 @@ namespace ICSharpCode.Decompiler.CSharp
EnumValueDisplayMode DetectBestEnumValueDisplayMode(ITypeDefinition typeDef, PEFile module) EnumValueDisplayMode DetectBestEnumValueDisplayMode(ITypeDefinition typeDef, PEFile module)
{ {
if (settings.AlwaysShowEnumMemberValues)
return EnumValueDisplayMode.All;
if (typeDef.HasAttribute(KnownAttribute.Flags, inherit: false)) if (typeDef.HasAttribute(KnownAttribute.Flags, inherit: false))
return EnumValueDisplayMode.All; return EnumValueDisplayMode.All;
bool first = true; bool first = true;

5
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -188,6 +188,11 @@ namespace ICSharpCode.Decompiler.CSharp
} }
internal bool HidesVariableWithName(string name) internal bool HidesVariableWithName(string name)
{
return HidesVariableWithName(currentFunction, name);
}
internal static bool HidesVariableWithName(ILFunction currentFunction, string name)
{ {
return currentFunction.Ancestors.OfType<ILFunction>().Any(HidesVariableOrNestedFunction); return currentFunction.Ancestors.OfType<ILFunction>().Any(HidesVariableOrNestedFunction);

27
ICSharpCode.Decompiler/CSharp/Transforms/DeclareVariables.cs

@ -180,16 +180,23 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
if (!IsValidInStatementExpression(stmt.Expression)) { if (!IsValidInStatementExpression(stmt.Expression)) {
// fetch ILFunction // fetch ILFunction
var function = stmt.Ancestors.SelectMany(a => a.Annotations.OfType<ILFunction>()).First(f => f.Parent == null); var function = stmt.Ancestors.SelectMany(a => a.Annotations.OfType<ILFunction>()).First(f => f.Parent == null);
// assign result to dummy variable // if possible use C# 7.0 discard-assignment
var type = stmt.Expression.GetResolveResult().Type; if (context.Settings.Discards && !ExpressionBuilder.HidesVariableWithName(function, "_")) {
var v = function.RegisterVariable( stmt.Expression = new AssignmentExpression(
VariableKind.StackSlot, new IdentifierExpression("_"), // no ResolveResult
type, stmt.Expression.Detach());
AssignVariableNames.GenerateVariableName(function, type, stmt.Expression.Annotations.OfType<ILInstruction>().Where(AssignVariableNames.IsSupportedInstruction).FirstOrDefault()) } else {
); // assign result to dummy variable
stmt.Expression = new AssignmentExpression( var type = stmt.Expression.GetResolveResult().Type;
new IdentifierExpression(v.Name).WithRR(new ILVariableResolveResult(v, v.Type)), var v = function.RegisterVariable(
stmt.Expression.Detach()); VariableKind.StackSlot,
type,
AssignVariableNames.GenerateVariableName(function, type, stmt.Expression.Annotations.OfType<ILInstruction>().Where(AssignVariableNames.IsSupportedInstruction).FirstOrDefault())
);
stmt.Expression = new AssignmentExpression(
new IdentifierExpression(v.Name).WithRR(new ILVariableResolveResult(v, v.Type)),
stmt.Expression.Detach());
}
} }
} }
} }

20
ICSharpCode.Decompiler/DecompilerSettings.cs

@ -537,6 +537,26 @@ namespace ICSharpCode.Decompiler
} }
} }
bool alwaysShowEnumMemberValues = false;
/// <summary>
/// Gets/Sets whether to always show enum member values.
/// true: <c>enum Kind { A = 0, B = 1, C = 5 }</c>
/// false: <c>enum Kind { A, B, C = 5 }</c>
/// default: false
/// </summary>
[Category("Other")]
[Description("DecompilerSettings.AlwaysShowEnumMemberValues")]
public bool AlwaysShowEnumMemberValues {
get { return alwaysShowEnumMemberValues; }
set {
if (alwaysShowEnumMemberValues != value) {
alwaysShowEnumMemberValues = value;
OnPropertyChanged();
}
}
}
bool useDebugSymbols = true; bool useDebugSymbols = true;
/// <summary> /// <summary>

2
ICSharpCode.Decompiler/IL/Transforms/AssignVariableNames.cs

@ -493,7 +493,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms
AddExistingName(reservedVariableNames, v.Name); AddExistingName(reservedVariableNames, v.Name);
} }
} }
foreach (var f in rootFunction.Method.DeclaringTypeDefinition.Fields.Select(f => f.Name)) foreach (var f in rootFunction.Method.DeclaringTypeDefinition.GetFields().Select(f => f.Name))
AddExistingName(reservedVariableNames, f); AddExistingName(reservedVariableNames, f);
return reservedVariableNames; return reservedVariableNames;
} }

2
ILSpy.AddIn/Commands/OpenReferenceCommand.cs

@ -59,12 +59,14 @@ namespace ICSharpCode.ILSpy.AddIn.Commands
OpenAssembliesInILSpy(parameters); OpenAssembliesInILSpy(parameters);
else else
owner.ShowMessage("Could not find reference '{0}', please ensure the project and all references were built correctly!", reference.Name); owner.ShowMessage("Could not find reference '{0}', please ensure the project and all references were built correctly!", reference.Name);
return;
} }
// Handle NuGet references // Handle NuGet references
var nugetRefItem = NuGetReferenceForILSpy.Detect(itemObject); var nugetRefItem = NuGetReferenceForILSpy.Detect(itemObject);
if (nugetRefItem != null) { if (nugetRefItem != null) {
OpenAssembliesInILSpy(nugetRefItem.GetILSpyParameters()); OpenAssembliesInILSpy(nugetRefItem.GetILSpyParameters());
return;
} }
// Handle project references // Handle project references

16
ILSpy.Package/ILSpy.Package.wapproj

@ -20,22 +20,6 @@
<Configuration>Release</Configuration> <Configuration>Release</Configuration>
<Platform>x64</Platform> <Platform>x64</Platform>
</ProjectConfiguration> </ProjectConfiguration>
<ProjectConfiguration Include="Debug|ARM">
<Configuration>Debug</Configuration>
<Platform>ARM</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM">
<Configuration>Release</Configuration>
<Platform>ARM</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|AnyCPU"> <ProjectConfiguration Include="Debug|AnyCPU">
<Configuration>Debug</Configuration> <Configuration>Debug</Configuration>
<Platform>AnyCPU</Platform> <Platform>AnyCPU</Platform>

BIN
ILSpy.Package/Images/StoreLogo.backup.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

2
ILSpy.Package/Package-CI.appxmanifest

@ -15,7 +15,7 @@
<Properties> <Properties>
<DisplayName>ILSpy (CI)</DisplayName> <DisplayName>ILSpy (CI)</DisplayName>
<PublisherDisplayName>ICSharpCode</PublisherDisplayName> <PublisherDisplayName>CN=ICSharpCode Team</PublisherDisplayName>
<Logo>Images\StoreLogo.png</Logo> <Logo>Images\StoreLogo.png</Logo>
</Properties> </Properties>

2
ILSpy.Package/Package-Local.appxmanifest

@ -15,7 +15,7 @@
<Properties> <Properties>
<DisplayName>ILSpy (Local)</DisplayName> <DisplayName>ILSpy (Local)</DisplayName>
<PublisherDisplayName>ICSharpCode</PublisherDisplayName> <PublisherDisplayName>CN=ICSharpCode Team</PublisherDisplayName>
<Logo>Images\StoreLogo.png</Logo> <Logo>Images\StoreLogo.png</Logo>
</Properties> </Properties>

6
ILSpy.Package/Package.appxmanifest

@ -9,13 +9,13 @@
IgnorableNamespaces="uap rescap"> IgnorableNamespaces="uap rescap">
<Identity <Identity
Name="ICSharpCode.ILSpy" Name="17310ICSharpCodeTeam.ILSpy"
Publisher="CN=ICSharpCode" Publisher="CN=2A240D0E-77E6-4732-9B57-AD934336A43E"
Version="$INSERTMAJORVERSION$.$INSERTMINORVERSION$.$INSERTREVISION$.0" /> Version="$INSERTMAJORVERSION$.$INSERTMINORVERSION$.$INSERTREVISION$.0" />
<Properties> <Properties>
<DisplayName>ILSpy</DisplayName> <DisplayName>ILSpy</DisplayName>
<PublisherDisplayName>ICSharpCode</PublisherDisplayName> <PublisherDisplayName>ICSharpCode Team</PublisherDisplayName>
<Logo>Images\StoreLogo.png</Logo> <Logo>Images\StoreLogo.png</Logo>
</Properties> </Properties>

96
ILSpy.WithPackage.sln

@ -44,213 +44,129 @@ EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
Debug|ARM = Debug|ARM
Debug|ARM64 = Debug|ARM64
Debug|x64 = Debug|x64 Debug|x64 = Debug|x64
Debug|x86 = Debug|x86 Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU Release|Any CPU = Release|Any CPU
Release|ARM = Release|ARM
Release|ARM64 = Release|ARM64
Release|x64 = Release|x64 Release|x64 = Release|x64
Release|x86 = Release|x86 Release|x86 = Release|x86
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{1E85EFF9-E370-4683-83E4-8A3D063FF791}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1E85EFF9-E370-4683-83E4-8A3D063FF791}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1E85EFF9-E370-4683-83E4-8A3D063FF791}.Debug|Any CPU.Build.0 = Debug|Any CPU {1E85EFF9-E370-4683-83E4-8A3D063FF791}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1E85EFF9-E370-4683-83E4-8A3D063FF791}.Debug|ARM.ActiveCfg = Debug|Any CPU
{1E85EFF9-E370-4683-83E4-8A3D063FF791}.Debug|ARM.Build.0 = Debug|Any CPU
{1E85EFF9-E370-4683-83E4-8A3D063FF791}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{1E85EFF9-E370-4683-83E4-8A3D063FF791}.Debug|ARM64.Build.0 = Debug|Any CPU
{1E85EFF9-E370-4683-83E4-8A3D063FF791}.Debug|x64.ActiveCfg = Debug|Any CPU {1E85EFF9-E370-4683-83E4-8A3D063FF791}.Debug|x64.ActiveCfg = Debug|Any CPU
{1E85EFF9-E370-4683-83E4-8A3D063FF791}.Debug|x64.Build.0 = Debug|Any CPU {1E85EFF9-E370-4683-83E4-8A3D063FF791}.Debug|x64.Build.0 = Debug|Any CPU
{1E85EFF9-E370-4683-83E4-8A3D063FF791}.Debug|x86.ActiveCfg = Debug|Any CPU {1E85EFF9-E370-4683-83E4-8A3D063FF791}.Debug|x86.ActiveCfg = Debug|Any CPU
{1E85EFF9-E370-4683-83E4-8A3D063FF791}.Debug|x86.Build.0 = Debug|Any CPU {1E85EFF9-E370-4683-83E4-8A3D063FF791}.Debug|x86.Build.0 = Debug|Any CPU
{1E85EFF9-E370-4683-83E4-8A3D063FF791}.Release|Any CPU.ActiveCfg = Release|Any CPU {1E85EFF9-E370-4683-83E4-8A3D063FF791}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1E85EFF9-E370-4683-83E4-8A3D063FF791}.Release|Any CPU.Build.0 = Release|Any CPU {1E85EFF9-E370-4683-83E4-8A3D063FF791}.Release|Any CPU.Build.0 = Release|Any CPU
{1E85EFF9-E370-4683-83E4-8A3D063FF791}.Release|ARM.ActiveCfg = Release|Any CPU
{1E85EFF9-E370-4683-83E4-8A3D063FF791}.Release|ARM.Build.0 = Release|Any CPU
{1E85EFF9-E370-4683-83E4-8A3D063FF791}.Release|ARM64.ActiveCfg = Release|Any CPU
{1E85EFF9-E370-4683-83E4-8A3D063FF791}.Release|ARM64.Build.0 = Release|Any CPU
{1E85EFF9-E370-4683-83E4-8A3D063FF791}.Release|x64.ActiveCfg = Release|Any CPU {1E85EFF9-E370-4683-83E4-8A3D063FF791}.Release|x64.ActiveCfg = Release|Any CPU
{1E85EFF9-E370-4683-83E4-8A3D063FF791}.Release|x64.Build.0 = Release|Any CPU {1E85EFF9-E370-4683-83E4-8A3D063FF791}.Release|x64.Build.0 = Release|Any CPU
{1E85EFF9-E370-4683-83E4-8A3D063FF791}.Release|x86.ActiveCfg = Release|Any CPU {1E85EFF9-E370-4683-83E4-8A3D063FF791}.Release|x86.ActiveCfg = Release|Any CPU
{1E85EFF9-E370-4683-83E4-8A3D063FF791}.Release|x86.Build.0 = Release|Any CPU {1E85EFF9-E370-4683-83E4-8A3D063FF791}.Release|x86.Build.0 = Release|Any CPU
{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Debug|Any CPU.Build.0 = Debug|Any CPU {DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Debug|ARM.ActiveCfg = Debug|Any CPU
{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Debug|ARM.Build.0 = Debug|Any CPU
{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Debug|ARM64.Build.0 = Debug|Any CPU
{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Debug|x64.ActiveCfg = Debug|Any CPU {DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Debug|x64.ActiveCfg = Debug|Any CPU
{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Debug|x64.Build.0 = Debug|Any CPU {DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Debug|x64.Build.0 = Debug|Any CPU
{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Debug|x86.ActiveCfg = Debug|Any CPU {DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Debug|x86.ActiveCfg = Debug|Any CPU
{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Debug|x86.Build.0 = Debug|Any CPU {DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Debug|x86.Build.0 = Debug|Any CPU
{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Release|Any CPU.ActiveCfg = Release|Any CPU {DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Release|Any CPU.Build.0 = Release|Any CPU {DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Release|Any CPU.Build.0 = Release|Any CPU
{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Release|ARM.ActiveCfg = Release|Any CPU
{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Release|ARM.Build.0 = Release|Any CPU
{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Release|ARM64.ActiveCfg = Release|Any CPU
{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Release|ARM64.Build.0 = Release|Any CPU
{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Release|x64.ActiveCfg = Release|Any CPU {DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Release|x64.ActiveCfg = Release|Any CPU
{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Release|x64.Build.0 = Release|Any CPU {DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Release|x64.Build.0 = Release|Any CPU
{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Release|x86.ActiveCfg = Release|Any CPU {DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Release|x86.ActiveCfg = Release|Any CPU
{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Release|x86.Build.0 = Release|Any CPU {DDE2A481-8271-4EAC-A330-8FA6A38D13D1}.Release|x86.Build.0 = Release|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {984CC812-9470-4A13-AFF9-CC44068D666C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.Debug|Any CPU.Build.0 = Debug|Any CPU {984CC812-9470-4A13-AFF9-CC44068D666C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.Debug|ARM.ActiveCfg = Debug|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.Debug|ARM.Build.0 = Debug|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.Debug|ARM64.Build.0 = Debug|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.Debug|x64.ActiveCfg = Debug|Any CPU {984CC812-9470-4A13-AFF9-CC44068D666C}.Debug|x64.ActiveCfg = Debug|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.Debug|x64.Build.0 = Debug|Any CPU {984CC812-9470-4A13-AFF9-CC44068D666C}.Debug|x64.Build.0 = Debug|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.Debug|x86.ActiveCfg = Debug|Any CPU {984CC812-9470-4A13-AFF9-CC44068D666C}.Debug|x86.ActiveCfg = Debug|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.Debug|x86.Build.0 = Debug|Any CPU {984CC812-9470-4A13-AFF9-CC44068D666C}.Debug|x86.Build.0 = Debug|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.Release|Any CPU.ActiveCfg = Release|Any CPU {984CC812-9470-4A13-AFF9-CC44068D666C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.Release|Any CPU.Build.0 = Release|Any CPU {984CC812-9470-4A13-AFF9-CC44068D666C}.Release|Any CPU.Build.0 = Release|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.Release|ARM.ActiveCfg = Release|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.Release|ARM.Build.0 = Release|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.Release|ARM64.ActiveCfg = Release|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.Release|ARM64.Build.0 = Release|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.Release|x64.ActiveCfg = Release|Any CPU {984CC812-9470-4A13-AFF9-CC44068D666C}.Release|x64.ActiveCfg = Release|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.Release|x64.Build.0 = Release|Any CPU {984CC812-9470-4A13-AFF9-CC44068D666C}.Release|x64.Build.0 = Release|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.Release|x86.ActiveCfg = Release|Any CPU {984CC812-9470-4A13-AFF9-CC44068D666C}.Release|x86.ActiveCfg = Release|Any CPU
{984CC812-9470-4A13-AFF9-CC44068D666C}.Release|x86.Build.0 = Release|Any CPU {984CC812-9470-4A13-AFF9-CC44068D666C}.Release|x86.Build.0 = Release|Any CPU
{FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Debug|Any CPU.Build.0 = Debug|Any CPU {FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Debug|ARM.ActiveCfg = Debug|Any CPU
{FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Debug|ARM.Build.0 = Debug|Any CPU
{FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Debug|ARM64.Build.0 = Debug|Any CPU
{FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Debug|x64.ActiveCfg = Debug|Any CPU {FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Debug|x64.ActiveCfg = Debug|Any CPU
{FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Debug|x64.Build.0 = Debug|Any CPU {FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Debug|x64.Build.0 = Debug|Any CPU
{FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Debug|x86.ActiveCfg = Debug|Any CPU {FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Debug|x86.ActiveCfg = Debug|Any CPU
{FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Debug|x86.Build.0 = Debug|Any CPU {FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Debug|x86.Build.0 = Debug|Any CPU
{FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Release|Any CPU.ActiveCfg = Release|Any CPU {FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Release|Any CPU.Build.0 = Release|Any CPU {FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Release|Any CPU.Build.0 = Release|Any CPU
{FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Release|ARM.ActiveCfg = Release|Any CPU
{FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Release|ARM.Build.0 = Release|Any CPU
{FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Release|ARM64.ActiveCfg = Release|Any CPU
{FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Release|ARM64.Build.0 = Release|Any CPU
{FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Release|x64.ActiveCfg = Release|Any CPU {FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Release|x64.ActiveCfg = Release|Any CPU
{FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Release|x64.Build.0 = Release|Any CPU {FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Release|x64.Build.0 = Release|Any CPU
{FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Release|x86.ActiveCfg = Release|Any CPU {FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Release|x86.ActiveCfg = Release|Any CPU
{FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Release|x86.Build.0 = Release|Any CPU {FEC0DA52-C4A6-4710-BE36-B484A20C5E22}.Release|x86.Build.0 = Release|Any CPU
{F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Debug|Any CPU.Build.0 = Debug|Any CPU {F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Debug|ARM.ActiveCfg = Debug|Any CPU
{F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Debug|ARM.Build.0 = Debug|Any CPU
{F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Debug|ARM64.Build.0 = Debug|Any CPU
{F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Debug|x64.ActiveCfg = Debug|Any CPU {F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Debug|x64.ActiveCfg = Debug|Any CPU
{F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Debug|x64.Build.0 = Debug|Any CPU {F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Debug|x64.Build.0 = Debug|Any CPU
{F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Debug|x86.ActiveCfg = Debug|Any CPU {F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Debug|x86.ActiveCfg = Debug|Any CPU
{F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Debug|x86.Build.0 = Debug|Any CPU {F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Debug|x86.Build.0 = Debug|Any CPU
{F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Release|Any CPU.ActiveCfg = Release|Any CPU {F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Release|Any CPU.Build.0 = Release|Any CPU {F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Release|Any CPU.Build.0 = Release|Any CPU
{F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Release|ARM.ActiveCfg = Release|Any CPU
{F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Release|ARM.Build.0 = Release|Any CPU
{F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Release|ARM64.ActiveCfg = Release|Any CPU
{F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Release|ARM64.Build.0 = Release|Any CPU
{F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Release|x64.ActiveCfg = Release|Any CPU {F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Release|x64.ActiveCfg = Release|Any CPU
{F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Release|x64.Build.0 = Release|Any CPU {F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Release|x64.Build.0 = Release|Any CPU
{F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Release|x86.ActiveCfg = Release|Any CPU {F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Release|x86.ActiveCfg = Release|Any CPU
{F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Release|x86.Build.0 = Release|Any CPU {F32EBCC8-0E53-4421-867E-05B3D6E10C70}.Release|x86.Build.0 = Release|Any CPU
{A6BAD2BA-76BA-461C-8B6D-418607591247}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A6BAD2BA-76BA-461C-8B6D-418607591247}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A6BAD2BA-76BA-461C-8B6D-418607591247}.Debug|Any CPU.Build.0 = Debug|Any CPU {A6BAD2BA-76BA-461C-8B6D-418607591247}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A6BAD2BA-76BA-461C-8B6D-418607591247}.Debug|ARM.ActiveCfg = Debug|Any CPU
{A6BAD2BA-76BA-461C-8B6D-418607591247}.Debug|ARM.Build.0 = Debug|Any CPU
{A6BAD2BA-76BA-461C-8B6D-418607591247}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{A6BAD2BA-76BA-461C-8B6D-418607591247}.Debug|ARM64.Build.0 = Debug|Any CPU
{A6BAD2BA-76BA-461C-8B6D-418607591247}.Debug|x64.ActiveCfg = Debug|Any CPU {A6BAD2BA-76BA-461C-8B6D-418607591247}.Debug|x64.ActiveCfg = Debug|Any CPU
{A6BAD2BA-76BA-461C-8B6D-418607591247}.Debug|x64.Build.0 = Debug|Any CPU {A6BAD2BA-76BA-461C-8B6D-418607591247}.Debug|x64.Build.0 = Debug|Any CPU
{A6BAD2BA-76BA-461C-8B6D-418607591247}.Debug|x86.ActiveCfg = Debug|Any CPU {A6BAD2BA-76BA-461C-8B6D-418607591247}.Debug|x86.ActiveCfg = Debug|Any CPU
{A6BAD2BA-76BA-461C-8B6D-418607591247}.Debug|x86.Build.0 = Debug|Any CPU {A6BAD2BA-76BA-461C-8B6D-418607591247}.Debug|x86.Build.0 = Debug|Any CPU
{A6BAD2BA-76BA-461C-8B6D-418607591247}.Release|Any CPU.ActiveCfg = Release|Any CPU {A6BAD2BA-76BA-461C-8B6D-418607591247}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A6BAD2BA-76BA-461C-8B6D-418607591247}.Release|Any CPU.Build.0 = Release|Any CPU {A6BAD2BA-76BA-461C-8B6D-418607591247}.Release|Any CPU.Build.0 = Release|Any CPU
{A6BAD2BA-76BA-461C-8B6D-418607591247}.Release|ARM.ActiveCfg = Release|Any CPU
{A6BAD2BA-76BA-461C-8B6D-418607591247}.Release|ARM.Build.0 = Release|Any CPU
{A6BAD2BA-76BA-461C-8B6D-418607591247}.Release|ARM64.ActiveCfg = Release|Any CPU
{A6BAD2BA-76BA-461C-8B6D-418607591247}.Release|ARM64.Build.0 = Release|Any CPU
{A6BAD2BA-76BA-461C-8B6D-418607591247}.Release|x64.ActiveCfg = Release|Any CPU {A6BAD2BA-76BA-461C-8B6D-418607591247}.Release|x64.ActiveCfg = Release|Any CPU
{A6BAD2BA-76BA-461C-8B6D-418607591247}.Release|x64.Build.0 = Release|Any CPU {A6BAD2BA-76BA-461C-8B6D-418607591247}.Release|x64.Build.0 = Release|Any CPU
{A6BAD2BA-76BA-461C-8B6D-418607591247}.Release|x86.ActiveCfg = Release|Any CPU {A6BAD2BA-76BA-461C-8B6D-418607591247}.Release|x86.ActiveCfg = Release|Any CPU
{A6BAD2BA-76BA-461C-8B6D-418607591247}.Release|x86.Build.0 = Release|Any CPU {A6BAD2BA-76BA-461C-8B6D-418607591247}.Release|x86.Build.0 = Release|Any CPU
{1169E6D1-1899-43D4-A500-07CE4235B388}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1169E6D1-1899-43D4-A500-07CE4235B388}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1169E6D1-1899-43D4-A500-07CE4235B388}.Debug|Any CPU.Build.0 = Debug|Any CPU {1169E6D1-1899-43D4-A500-07CE4235B388}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1169E6D1-1899-43D4-A500-07CE4235B388}.Debug|ARM.ActiveCfg = Debug|Any CPU
{1169E6D1-1899-43D4-A500-07CE4235B388}.Debug|ARM.Build.0 = Debug|Any CPU
{1169E6D1-1899-43D4-A500-07CE4235B388}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{1169E6D1-1899-43D4-A500-07CE4235B388}.Debug|ARM64.Build.0 = Debug|Any CPU
{1169E6D1-1899-43D4-A500-07CE4235B388}.Debug|x64.ActiveCfg = Debug|Any CPU {1169E6D1-1899-43D4-A500-07CE4235B388}.Debug|x64.ActiveCfg = Debug|Any CPU
{1169E6D1-1899-43D4-A500-07CE4235B388}.Debug|x64.Build.0 = Debug|Any CPU {1169E6D1-1899-43D4-A500-07CE4235B388}.Debug|x64.Build.0 = Debug|Any CPU
{1169E6D1-1899-43D4-A500-07CE4235B388}.Debug|x86.ActiveCfg = Debug|Any CPU {1169E6D1-1899-43D4-A500-07CE4235B388}.Debug|x86.ActiveCfg = Debug|Any CPU
{1169E6D1-1899-43D4-A500-07CE4235B388}.Debug|x86.Build.0 = Debug|Any CPU {1169E6D1-1899-43D4-A500-07CE4235B388}.Debug|x86.Build.0 = Debug|Any CPU
{1169E6D1-1899-43D4-A500-07CE4235B388}.Release|Any CPU.ActiveCfg = Release|Any CPU {1169E6D1-1899-43D4-A500-07CE4235B388}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1169E6D1-1899-43D4-A500-07CE4235B388}.Release|Any CPU.Build.0 = Release|Any CPU {1169E6D1-1899-43D4-A500-07CE4235B388}.Release|Any CPU.Build.0 = Release|Any CPU
{1169E6D1-1899-43D4-A500-07CE4235B388}.Release|ARM.ActiveCfg = Release|Any CPU
{1169E6D1-1899-43D4-A500-07CE4235B388}.Release|ARM.Build.0 = Release|Any CPU
{1169E6D1-1899-43D4-A500-07CE4235B388}.Release|ARM64.ActiveCfg = Release|Any CPU
{1169E6D1-1899-43D4-A500-07CE4235B388}.Release|ARM64.Build.0 = Release|Any CPU
{1169E6D1-1899-43D4-A500-07CE4235B388}.Release|x64.ActiveCfg = Release|Any CPU {1169E6D1-1899-43D4-A500-07CE4235B388}.Release|x64.ActiveCfg = Release|Any CPU
{1169E6D1-1899-43D4-A500-07CE4235B388}.Release|x64.Build.0 = Release|Any CPU {1169E6D1-1899-43D4-A500-07CE4235B388}.Release|x64.Build.0 = Release|Any CPU
{1169E6D1-1899-43D4-A500-07CE4235B388}.Release|x86.ActiveCfg = Release|Any CPU {1169E6D1-1899-43D4-A500-07CE4235B388}.Release|x86.ActiveCfg = Release|Any CPU
{1169E6D1-1899-43D4-A500-07CE4235B388}.Release|x86.Build.0 = Release|Any CPU {1169E6D1-1899-43D4-A500-07CE4235B388}.Release|x86.Build.0 = Release|Any CPU
{9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Debug|Any CPU.Build.0 = Debug|Any CPU {9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Debug|ARM.ActiveCfg = Debug|Any CPU
{9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Debug|ARM.Build.0 = Debug|Any CPU
{9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Debug|ARM64.Build.0 = Debug|Any CPU
{9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Debug|x64.ActiveCfg = Debug|Any CPU {9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Debug|x64.ActiveCfg = Debug|Any CPU
{9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Debug|x64.Build.0 = Debug|Any CPU {9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Debug|x64.Build.0 = Debug|Any CPU
{9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Debug|x86.ActiveCfg = Debug|Any CPU {9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Debug|x86.ActiveCfg = Debug|Any CPU
{9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Debug|x86.Build.0 = Debug|Any CPU {9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Debug|x86.Build.0 = Debug|Any CPU
{9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Release|Any CPU.ActiveCfg = Release|Any CPU {9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Release|Any CPU.Build.0 = Release|Any CPU {9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Release|Any CPU.Build.0 = Release|Any CPU
{9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Release|ARM.ActiveCfg = Release|Any CPU
{9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Release|ARM.Build.0 = Release|Any CPU
{9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Release|ARM64.ActiveCfg = Release|Any CPU
{9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Release|ARM64.Build.0 = Release|Any CPU
{9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Release|x64.ActiveCfg = Release|Any CPU {9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Release|x64.ActiveCfg = Release|Any CPU
{9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Release|x64.Build.0 = Release|Any CPU {9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Release|x64.Build.0 = Release|Any CPU
{9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Release|x86.ActiveCfg = Release|Any CPU {9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Release|x86.ActiveCfg = Release|Any CPU
{9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Release|x86.Build.0 = Release|Any CPU {9D7BE6C0-B7B3-4A50-A54E-18A2D84A3384}.Release|x86.Build.0 = Release|Any CPU
{B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Debug|Any CPU.Build.0 = Debug|Any CPU {B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Debug|ARM.ActiveCfg = Debug|Any CPU
{B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Debug|ARM.Build.0 = Debug|Any CPU
{B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Debug|ARM64.Build.0 = Debug|Any CPU
{B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Debug|x64.ActiveCfg = Debug|Any CPU {B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Debug|x64.ActiveCfg = Debug|Any CPU
{B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Debug|x64.Build.0 = Debug|Any CPU {B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Debug|x64.Build.0 = Debug|Any CPU
{B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Debug|x86.ActiveCfg = Debug|Any CPU {B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Debug|x86.ActiveCfg = Debug|Any CPU
{B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Debug|x86.Build.0 = Debug|Any CPU {B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Debug|x86.Build.0 = Debug|Any CPU
{B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Release|Any CPU.ActiveCfg = Release|Any CPU {B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Release|Any CPU.Build.0 = Release|Any CPU {B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Release|Any CPU.Build.0 = Release|Any CPU
{B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Release|ARM.ActiveCfg = Release|Any CPU
{B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Release|ARM.Build.0 = Release|Any CPU
{B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Release|ARM64.ActiveCfg = Release|Any CPU
{B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Release|ARM64.Build.0 = Release|Any CPU
{B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Release|x64.ActiveCfg = Release|Any CPU {B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Release|x64.ActiveCfg = Release|Any CPU
{B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Release|x64.Build.0 = Release|Any CPU {B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Release|x64.Build.0 = Release|Any CPU
{B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Release|x86.ActiveCfg = Release|Any CPU {B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Release|x86.ActiveCfg = Release|Any CPU
{B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Release|x86.Build.0 = Release|Any CPU {B85A155A-9DD6-43BC-A624-2D8EC773D71F}.Release|x86.Build.0 = Release|Any CPU
{B51C6636-B8D1-4200-9869-08F2689DE6C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B51C6636-B8D1-4200-9869-08F2689DE6C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B51C6636-B8D1-4200-9869-08F2689DE6C2}.Debug|Any CPU.Build.0 = Debug|Any CPU {B51C6636-B8D1-4200-9869-08F2689DE6C2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B51C6636-B8D1-4200-9869-08F2689DE6C2}.Debug|ARM.ActiveCfg = Debug|Any CPU
{B51C6636-B8D1-4200-9869-08F2689DE6C2}.Debug|ARM.Build.0 = Debug|Any CPU
{B51C6636-B8D1-4200-9869-08F2689DE6C2}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{B51C6636-B8D1-4200-9869-08F2689DE6C2}.Debug|ARM64.Build.0 = Debug|Any CPU
{B51C6636-B8D1-4200-9869-08F2689DE6C2}.Debug|x64.ActiveCfg = Debug|Any CPU {B51C6636-B8D1-4200-9869-08F2689DE6C2}.Debug|x64.ActiveCfg = Debug|Any CPU
{B51C6636-B8D1-4200-9869-08F2689DE6C2}.Debug|x64.Build.0 = Debug|Any CPU {B51C6636-B8D1-4200-9869-08F2689DE6C2}.Debug|x64.Build.0 = Debug|Any CPU
{B51C6636-B8D1-4200-9869-08F2689DE6C2}.Debug|x86.ActiveCfg = Debug|Any CPU {B51C6636-B8D1-4200-9869-08F2689DE6C2}.Debug|x86.ActiveCfg = Debug|Any CPU
{B51C6636-B8D1-4200-9869-08F2689DE6C2}.Debug|x86.Build.0 = Debug|Any CPU {B51C6636-B8D1-4200-9869-08F2689DE6C2}.Debug|x86.Build.0 = Debug|Any CPU
{B51C6636-B8D1-4200-9869-08F2689DE6C2}.Release|Any CPU.ActiveCfg = Release|Any CPU {B51C6636-B8D1-4200-9869-08F2689DE6C2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B51C6636-B8D1-4200-9869-08F2689DE6C2}.Release|Any CPU.Build.0 = Release|Any CPU {B51C6636-B8D1-4200-9869-08F2689DE6C2}.Release|Any CPU.Build.0 = Release|Any CPU
{B51C6636-B8D1-4200-9869-08F2689DE6C2}.Release|ARM.ActiveCfg = Release|Any CPU
{B51C6636-B8D1-4200-9869-08F2689DE6C2}.Release|ARM.Build.0 = Release|Any CPU
{B51C6636-B8D1-4200-9869-08F2689DE6C2}.Release|ARM64.ActiveCfg = Release|Any CPU
{B51C6636-B8D1-4200-9869-08F2689DE6C2}.Release|ARM64.Build.0 = Release|Any CPU
{B51C6636-B8D1-4200-9869-08F2689DE6C2}.Release|x64.ActiveCfg = Release|Any CPU {B51C6636-B8D1-4200-9869-08F2689DE6C2}.Release|x64.ActiveCfg = Release|Any CPU
{B51C6636-B8D1-4200-9869-08F2689DE6C2}.Release|x64.Build.0 = Release|Any CPU {B51C6636-B8D1-4200-9869-08F2689DE6C2}.Release|x64.Build.0 = Release|Any CPU
{B51C6636-B8D1-4200-9869-08F2689DE6C2}.Release|x86.ActiveCfg = Release|Any CPU {B51C6636-B8D1-4200-9869-08F2689DE6C2}.Release|x86.ActiveCfg = Release|Any CPU
@ -258,12 +174,6 @@ Global
{BAB51A23-9C15-42CC-8465-EB732BF9A932}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BAB51A23-9C15-42CC-8465-EB732BF9A932}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BAB51A23-9C15-42CC-8465-EB732BF9A932}.Debug|Any CPU.Build.0 = Debug|Any CPU {BAB51A23-9C15-42CC-8465-EB732BF9A932}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BAB51A23-9C15-42CC-8465-EB732BF9A932}.Debug|Any CPU.Deploy.0 = Debug|Any CPU {BAB51A23-9C15-42CC-8465-EB732BF9A932}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
{BAB51A23-9C15-42CC-8465-EB732BF9A932}.Debug|ARM.ActiveCfg = Debug|ARM
{BAB51A23-9C15-42CC-8465-EB732BF9A932}.Debug|ARM.Build.0 = Debug|ARM
{BAB51A23-9C15-42CC-8465-EB732BF9A932}.Debug|ARM.Deploy.0 = Debug|ARM
{BAB51A23-9C15-42CC-8465-EB732BF9A932}.Debug|ARM64.ActiveCfg = Debug|ARM64
{BAB51A23-9C15-42CC-8465-EB732BF9A932}.Debug|ARM64.Build.0 = Debug|ARM64
{BAB51A23-9C15-42CC-8465-EB732BF9A932}.Debug|ARM64.Deploy.0 = Debug|ARM64
{BAB51A23-9C15-42CC-8465-EB732BF9A932}.Debug|x64.ActiveCfg = Debug|x64 {BAB51A23-9C15-42CC-8465-EB732BF9A932}.Debug|x64.ActiveCfg = Debug|x64
{BAB51A23-9C15-42CC-8465-EB732BF9A932}.Debug|x64.Build.0 = Debug|x64 {BAB51A23-9C15-42CC-8465-EB732BF9A932}.Debug|x64.Build.0 = Debug|x64
{BAB51A23-9C15-42CC-8465-EB732BF9A932}.Debug|x64.Deploy.0 = Debug|x64 {BAB51A23-9C15-42CC-8465-EB732BF9A932}.Debug|x64.Deploy.0 = Debug|x64
@ -273,12 +183,6 @@ Global
{BAB51A23-9C15-42CC-8465-EB732BF9A932}.Release|Any CPU.ActiveCfg = Release|Any CPU {BAB51A23-9C15-42CC-8465-EB732BF9A932}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BAB51A23-9C15-42CC-8465-EB732BF9A932}.Release|Any CPU.Build.0 = Release|Any CPU {BAB51A23-9C15-42CC-8465-EB732BF9A932}.Release|Any CPU.Build.0 = Release|Any CPU
{BAB51A23-9C15-42CC-8465-EB732BF9A932}.Release|Any CPU.Deploy.0 = Release|Any CPU {BAB51A23-9C15-42CC-8465-EB732BF9A932}.Release|Any CPU.Deploy.0 = Release|Any CPU
{BAB51A23-9C15-42CC-8465-EB732BF9A932}.Release|ARM.ActiveCfg = Release|ARM
{BAB51A23-9C15-42CC-8465-EB732BF9A932}.Release|ARM.Build.0 = Release|ARM
{BAB51A23-9C15-42CC-8465-EB732BF9A932}.Release|ARM.Deploy.0 = Release|ARM
{BAB51A23-9C15-42CC-8465-EB732BF9A932}.Release|ARM64.ActiveCfg = Release|ARM64
{BAB51A23-9C15-42CC-8465-EB732BF9A932}.Release|ARM64.Build.0 = Release|ARM64
{BAB51A23-9C15-42CC-8465-EB732BF9A932}.Release|ARM64.Deploy.0 = Release|ARM64
{BAB51A23-9C15-42CC-8465-EB732BF9A932}.Release|x64.ActiveCfg = Release|x64 {BAB51A23-9C15-42CC-8465-EB732BF9A932}.Release|x64.ActiveCfg = Release|x64
{BAB51A23-9C15-42CC-8465-EB732BF9A932}.Release|x64.Build.0 = Release|x64 {BAB51A23-9C15-42CC-8465-EB732BF9A932}.Release|x64.Build.0 = Release|x64
{BAB51A23-9C15-42CC-8465-EB732BF9A932}.Release|x64.Deploy.0 = Release|x64 {BAB51A23-9C15-42CC-8465-EB732BF9A932}.Release|x64.Deploy.0 = Release|x64

13
ILSpy/Analyzers/Builtin/EventImplementsInterfaceAnalyzer.cs

@ -42,15 +42,16 @@ namespace ICSharpCode.ILSpy.Analyzers.Builtin
IEnumerable<IEntity> AnalyzeType(IEvent analyzedEntity, ITypeDefinition type) IEnumerable<IEntity> AnalyzeType(IEvent analyzedEntity, ITypeDefinition type)
{ {
var token = analyzedEntity.DeclaringTypeDefinition.MetadataToken; var token = analyzedEntity.MetadataToken;
var declaringTypeToken = analyzedEntity.DeclaringTypeDefinition.MetadataToken;
var module = analyzedEntity.DeclaringTypeDefinition.ParentModule.PEFile; var module = analyzedEntity.DeclaringTypeDefinition.ParentModule.PEFile;
if (!type.GetAllBaseTypeDefinitions() var allTypes = type.GetAllBaseTypeDefinitions();
.Any(t => t.MetadataToken == token && t.ParentModule.PEFile == module)) if (!allTypes.Any(t => t.MetadataToken == declaringTypeToken && t.ParentModule.PEFile == module))
yield break; yield break;
foreach (var @event in type.GetEvents(options: GetMemberOptions.ReturnMemberDefinitions)) { foreach (var @event in type.Events) {
if (InheritanceHelper.GetBaseMembers(@event, true) var baseMembers = InheritanceHelper.GetBaseMembers(@event, true);
.Any(m => m.DeclaringTypeDefinition.MetadataToken == token && m.ParentModule.PEFile == module)) if (baseMembers.Any(m => m.MetadataToken == token && m.ParentModule.PEFile == module))
yield return @event; yield return @event;
} }
} }

12
ILSpy/Analyzers/Builtin/EventOverriddenByAnalyzer.cs

@ -42,15 +42,17 @@ namespace ICSharpCode.ILSpy.Analyzers.Builtin
IEnumerable<IEntity> AnalyzeType(IEvent analyzedEntity, ITypeDefinition type) IEnumerable<IEntity> AnalyzeType(IEvent analyzedEntity, ITypeDefinition type)
{ {
if (!analyzedEntity.DeclaringType.GetAllBaseTypeDefinitions() var token = analyzedEntity.MetadataToken;
.Any(t => t.MetadataToken == analyzedEntity.DeclaringTypeDefinition.MetadataToken && t.ParentModule.PEFile == type.ParentModule.PEFile)) var declaringTypeToken = analyzedEntity.DeclaringTypeDefinition.MetadataToken;
var module = analyzedEntity.DeclaringTypeDefinition.ParentModule.PEFile;
var allTypes = type.GetAllBaseTypeDefinitions();
if (!allTypes.Any(t => t.MetadataToken == declaringTypeToken && t.ParentModule.PEFile == module))
yield break; yield break;
foreach (var @event in type.Events) { foreach (var @event in type.Events) {
if (!@event.IsOverride) continue; if (!@event.IsOverride) continue;
if (InheritanceHelper.GetBaseMembers(@event, false) var baseMembers = InheritanceHelper.GetBaseMembers(@event, false);
.Any(p => p.MetadataToken == analyzedEntity.MetadataToken && if (baseMembers.Any(p => p.MetadataToken == token && p.ParentModule.PEFile == module)) {
p.ParentModule.PEFile == analyzedEntity.ParentModule.PEFile)) {
yield return @event; yield return @event;
} }
} }

13
ILSpy/Analyzers/Builtin/MethodImplementsInterfaceAnalyzer.cs

@ -45,15 +45,16 @@ namespace ICSharpCode.ILSpy.Analyzers.Builtin
IEnumerable<IEntity> AnalyzeType(IMethod analyzedEntity, ITypeDefinition type) IEnumerable<IEntity> AnalyzeType(IMethod analyzedEntity, ITypeDefinition type)
{ {
var token = analyzedEntity.DeclaringTypeDefinition.MetadataToken; var token = analyzedEntity.MetadataToken;
var declaringTypeToken = analyzedEntity.DeclaringTypeDefinition.MetadataToken;
var module = analyzedEntity.DeclaringTypeDefinition.ParentModule.PEFile; var module = analyzedEntity.DeclaringTypeDefinition.ParentModule.PEFile;
if (!type.GetAllBaseTypeDefinitions() var allTypes = type.GetAllBaseTypeDefinitions();
.Any(t => t.MetadataToken == token && t.ParentModule.PEFile == module)) if (!allTypes.Any(t => t.MetadataToken == declaringTypeToken && t.ParentModule.PEFile == module))
yield break; yield break;
foreach (var method in type.GetMethods(options: GetMemberOptions.ReturnMemberDefinitions)) { foreach (var method in type.Methods) {
if (InheritanceHelper.GetBaseMembers(method, true) var baseMembers = InheritanceHelper.GetBaseMembers(method, true);
.Any(m => m.DeclaringTypeDefinition.MetadataToken == token && m.ParentModule.PEFile == module)) if (baseMembers.Any(m => m.MetadataToken == token && m.ParentModule.PEFile == module))
yield return method; yield return method;
} }
} }

13
ILSpy/Analyzers/Builtin/MethodOverriddenByAnalyzer.cs

@ -44,16 +44,17 @@ namespace ICSharpCode.ILSpy.Analyzers.Builtin
IEnumerable<IEntity> AnalyzeType(IMethod analyzedEntity, ITypeDefinition type) IEnumerable<IEntity> AnalyzeType(IMethod analyzedEntity, ITypeDefinition type)
{ {
if (!type.GetAllBaseTypeDefinitions() var token = analyzedEntity.MetadataToken;
.Any(t => t.MetadataToken == analyzedEntity.DeclaringTypeDefinition.MetadataToken var declaringTypeToken = analyzedEntity.DeclaringTypeDefinition.MetadataToken;
&& t.ParentModule.PEFile == analyzedEntity.ParentModule.PEFile)) var module = analyzedEntity.DeclaringTypeDefinition.ParentModule.PEFile;
var allTypes = type.GetAllBaseTypeDefinitions();
if (!allTypes.Any(t => t.MetadataToken == declaringTypeToken && t.ParentModule.PEFile == module))
yield break; yield break;
foreach (var method in type.Methods) { foreach (var method in type.Methods) {
if (!method.IsOverride) continue; if (!method.IsOverride) continue;
if (InheritanceHelper.GetBaseMembers(method, false) var baseMembers = InheritanceHelper.GetBaseMembers(method, false);
.Any(p => p.MetadataToken == analyzedEntity.MetadataToken && if (baseMembers.Any(p => p.MetadataToken == token && p.ParentModule.PEFile == module)) {
p.ParentModule.PEFile == analyzedEntity.ParentModule.PEFile)) {
yield return method; yield return method;
} }
} }

13
ILSpy/Analyzers/Builtin/PropertyImplementsInterfaceAnalyzer.cs

@ -42,15 +42,16 @@ namespace ICSharpCode.ILSpy.Analyzers.Builtin
IEnumerable<IEntity> AnalyzeType(IProperty analyzedEntity, ITypeDefinition type) IEnumerable<IEntity> AnalyzeType(IProperty analyzedEntity, ITypeDefinition type)
{ {
var token = analyzedEntity.DeclaringTypeDefinition.MetadataToken; var token = analyzedEntity.MetadataToken;
var declaringTypeToken = analyzedEntity.DeclaringTypeDefinition.MetadataToken;
var module = analyzedEntity.DeclaringTypeDefinition.ParentModule.PEFile; var module = analyzedEntity.DeclaringTypeDefinition.ParentModule.PEFile;
if (!type.GetAllBaseTypeDefinitions() var allTypes = type.GetAllBaseTypeDefinitions();
.Any(t => t.MetadataToken == token && t.ParentModule.PEFile == module)) if (!allTypes.Any(t => t.MetadataToken == declaringTypeToken && t.ParentModule.PEFile == module))
yield break; yield break;
foreach (var property in type.GetProperties(options: GetMemberOptions.ReturnMemberDefinitions)) { foreach (var property in type.Properties) {
if (InheritanceHelper.GetBaseMembers(property, true) var baseMembers = InheritanceHelper.GetBaseMembers(property, true);
.Any(m => m.DeclaringTypeDefinition.MetadataToken == token && m.ParentModule.PEFile == module)) if (baseMembers.Any(m => m.MetadataToken == token && m.ParentModule.PEFile == module))
yield return property; yield return property;
} }
} }

12
ILSpy/Analyzers/Builtin/PropertyOverriddenByAnalyzer.cs

@ -45,15 +45,17 @@ namespace ICSharpCode.ILSpy.Analyzers.Builtin
IEnumerable<IEntity> AnalyzeType(IProperty analyzedEntity, ITypeDefinition type) IEnumerable<IEntity> AnalyzeType(IProperty analyzedEntity, ITypeDefinition type)
{ {
if (!analyzedEntity.DeclaringType.GetAllBaseTypeDefinitions() var token = analyzedEntity.MetadataToken;
.Any(t => t.MetadataToken == analyzedEntity.DeclaringTypeDefinition.MetadataToken && t.ParentModule.PEFile == type.ParentModule.PEFile)) var declaringTypeToken = analyzedEntity.DeclaringTypeDefinition.MetadataToken;
var module = analyzedEntity.DeclaringTypeDefinition.ParentModule.PEFile;
var allTypes = type.GetAllBaseTypeDefinitions();
if (!allTypes.Any(t => t.MetadataToken == declaringTypeToken && t.ParentModule.PEFile == module))
yield break; yield break;
foreach (var property in type.Properties) { foreach (var property in type.Properties) {
if (!property.IsOverride) continue; if (!property.IsOverride) continue;
if (InheritanceHelper.GetBaseMembers(property, false) var baseMembers = InheritanceHelper.GetBaseMembers(property, false);
.Any(p => p.MetadataToken == analyzedEntity.MetadataToken && if (baseMembers.Any(p => p.MetadataToken == token && p.ParentModule.PEFile == module)) {
p.ParentModule.PEFile == analyzedEntity.ParentModule.PEFile)) {
yield return property; yield return property;
} }
} }

5
ILSpy/ILSpy.csproj

@ -49,7 +49,6 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="AvalonEdit" Version="6.0.0-rc1" /> <PackageReference Include="AvalonEdit" Version="6.0.0-rc1" />
<PackageReference Include="Microsoft.DiaSymReader.Converter.Xml" Version="1.1.0-beta1-63314-01" />
<PackageReference Include="Microsoft.VisualStudio.Composition" Version="15.5.23" /> <PackageReference Include="Microsoft.VisualStudio.Composition" Version="15.5.23" />
<PackageReference Include="Mono.Cecil" Version="0.10.3" /> <PackageReference Include="Mono.Cecil" Version="0.10.3" />
<PackageReference Include="OSVersionHelper" Version="1.0.11" /> <PackageReference Include="OSVersionHelper" Version="1.0.11" />
@ -60,6 +59,10 @@
<ProjectReference Include="..\SharpTreeView\ICSharpCode.TreeView.csproj" /> <ProjectReference Include="..\SharpTreeView\ICSharpCode.TreeView.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup Condition="'$(Configuration)' == 'Debug'">
<PackageReference Include="Microsoft.DiaSymReader.Converter.Xml" Version="1.1.0-beta1-63314-01" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<ApplicationDefinition Include="App.xaml" /> <ApplicationDefinition Include="App.xaml" />
</ItemGroup> </ItemGroup>

221
ILSpy/MainWindow.xaml.cs

@ -53,26 +53,27 @@ namespace ICSharpCode.ILSpy
partial class MainWindow : Window partial class MainWindow : Window
{ {
bool refreshInProgress; bool refreshInProgress;
bool handlingNugetPackageSelection;
readonly NavigationHistory<NavigationState> history = new NavigationHistory<NavigationState>(); readonly NavigationHistory<NavigationState> history = new NavigationHistory<NavigationState>();
ILSpySettings spySettingsForMainWindow_Loaded; ILSpySettings spySettingsForMainWindow_Loaded;
internal SessionSettings sessionSettings; internal SessionSettings sessionSettings;
internal AssemblyListManager assemblyListManager; internal AssemblyListManager assemblyListManager;
AssemblyList assemblyList; AssemblyList assemblyList;
AssemblyListTreeNode assemblyListTreeNode; AssemblyListTreeNode assemblyListTreeNode;
readonly DecompilerTextView decompilerTextView; readonly DecompilerTextView decompilerTextView;
static MainWindow instance; static MainWindow instance;
public static MainWindow Instance { public static MainWindow Instance {
get { return instance; } get { return instance; }
} }
public SessionSettings SessionSettings { public SessionSettings SessionSettings {
get { return sessionSettings; } get { return sessionSettings; }
} }
public MainWindow() public MainWindow()
{ {
instance = this; instance = this;
@ -80,28 +81,28 @@ namespace ICSharpCode.ILSpy
this.spySettingsForMainWindow_Loaded = spySettings; this.spySettingsForMainWindow_Loaded = spySettings;
this.sessionSettings = new SessionSettings(spySettings); this.sessionSettings = new SessionSettings(spySettings);
this.assemblyListManager = new AssemblyListManager(spySettings); this.assemblyListManager = new AssemblyListManager(spySettings);
this.Icon = new BitmapImage(new Uri("pack://application:,,,/ILSpy;component/images/ILSpy.ico")); this.Icon = new BitmapImage(new Uri("pack://application:,,,/ILSpy;component/images/ILSpy.ico"));
this.DataContext = sessionSettings; this.DataContext = sessionSettings;
InitializeComponent(); InitializeComponent();
decompilerTextView = App.ExportProvider.GetExportedValue<DecompilerTextView>(); decompilerTextView = App.ExportProvider.GetExportedValue<DecompilerTextView>();
mainPane.Content = decompilerTextView; mainPane.Content = decompilerTextView;
if (sessionSettings.SplitterPosition > 0 && sessionSettings.SplitterPosition < 1) { if (sessionSettings.SplitterPosition > 0 && sessionSettings.SplitterPosition < 1) {
leftColumn.Width = new GridLength(sessionSettings.SplitterPosition, GridUnitType.Star); leftColumn.Width = new GridLength(sessionSettings.SplitterPosition, GridUnitType.Star);
rightColumn.Width = new GridLength(1 - sessionSettings.SplitterPosition, GridUnitType.Star); rightColumn.Width = new GridLength(1 - sessionSettings.SplitterPosition, GridUnitType.Star);
} }
sessionSettings.FilterSettings.PropertyChanged += filterSettings_PropertyChanged; sessionSettings.FilterSettings.PropertyChanged += filterSettings_PropertyChanged;
InitMainMenu(); InitMainMenu();
InitToolbar(); InitToolbar();
ContextMenuProvider.Add(treeView, decompilerTextView); ContextMenuProvider.Add(treeView, decompilerTextView);
this.Loaded += MainWindow_Loaded; this.Loaded += MainWindow_Loaded;
} }
void SetWindowBounds(Rect bounds) void SetWindowBounds(Rect bounds)
{ {
this.Left = bounds.Left; this.Left = bounds.Left;
@ -109,9 +110,9 @@ namespace ICSharpCode.ILSpy
this.Width = bounds.Width; this.Width = bounds.Width;
this.Height = bounds.Height; this.Height = bounds.Height;
} }
#region Toolbar extensibility #region Toolbar extensibility
void InitToolbar() void InitToolbar()
{ {
int navigationPos = 0; int navigationPos = 0;
@ -134,9 +135,9 @@ namespace ICSharpCode.ILSpy
} }
} }
} }
} }
Button MakeToolbarItem(Lazy<ICommand, IToolbarCommandMetadata> command) Button MakeToolbarItem(Lazy<ICommand, IToolbarCommandMetadata> command)
{ {
object image = Images.Load(command.Value, command.Metadata.ToolbarIcon); object image = Images.Load(command.Value, command.Metadata.ToolbarIcon);
@ -155,9 +156,9 @@ namespace ICSharpCode.ILSpy
}; };
} }
#endregion #endregion
#region Main Menu extensibility #region Main Menu extensibility
void InitMainMenu() void InitMainMenu()
{ {
var mainMenuCommands = App.ExportProvider.GetExports<ICommand, IMainMenuCommandMetadata>("MainMenuCommand"); var mainMenuCommands = App.ExportProvider.GetExports<ICommand, IMainMenuCommandMetadata>("MainMenuCommand");
@ -198,8 +199,8 @@ namespace ICSharpCode.ILSpy
internal static string GetResourceString(string key) internal static string GetResourceString(string key)
{ {
var str = !string.IsNullOrEmpty(key)? Properties.Resources.ResourceManager.GetString(key):null; var str = !string.IsNullOrEmpty(key) ? Properties.Resources.ResourceManager.GetString(key) : null;
return string.IsNullOrEmpty(key)|| string.IsNullOrEmpty(str) ? key : str; return string.IsNullOrEmpty(key) || string.IsNullOrEmpty(str) ? key : str;
} }
#endregion #endregion
@ -225,16 +226,18 @@ namespace ICSharpCode.ILSpy
SetWindowBounds(sessionSettings.WindowBounds); SetWindowBounds(sessionSettings.WindowBounds);
else else
SetWindowBounds(SessionSettings.DefaultWindowBounds); SetWindowBounds(SessionSettings.DefaultWindowBounds);
this.WindowState = sessionSettings.WindowState; this.WindowState = sessionSettings.WindowState;
} }
unsafe IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) unsafe IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{ {
if (msg == NativeMethods.WM_COPYDATA) { if (msg == NativeMethods.WM_COPYDATA) {
CopyDataStruct* copyData = (CopyDataStruct*)lParam; CopyDataStruct* copyData = (CopyDataStruct*)lParam;
string data = new string((char*)copyData->Buffer, 0, copyData->Size / sizeof(char)); string data = new string((char*)copyData->Buffer, 0, copyData->Size / sizeof(char));
if (data.StartsWith("ILSpy:\r\n", StringComparison.Ordinal)) { if (data.StartsWith("ILSpy:\r\n", StringComparison.Ordinal)) {
if (handlingNugetPackageSelection)
return (IntPtr)1;
data = data.Substring(8); data = data.Substring(8);
List<string> lines = new List<string>(); List<string> lines = new List<string>();
using (StringReader r = new StringReader(data)) { using (StringReader r = new StringReader(data)) {
@ -255,17 +258,17 @@ namespace ICSharpCode.ILSpy
return IntPtr.Zero; return IntPtr.Zero;
} }
#endregion #endregion
public AssemblyList CurrentAssemblyList { public AssemblyList CurrentAssemblyList {
get { return assemblyList; } get { return assemblyList; }
} }
public event NotifyCollectionChangedEventHandler CurrentAssemblyListChanged; public event NotifyCollectionChangedEventHandler CurrentAssemblyListChanged;
List<LoadedAssembly> commandLineLoadedAssemblies = new List<LoadedAssembly>(); List<LoadedAssembly> commandLineLoadedAssemblies = new List<LoadedAssembly>();
List<string> nugetPackagesToLoad = new List<string>(); List<string> nugetPackagesToLoad = new List<string>();
bool HandleCommandLineArguments(CommandLineArguments args) bool HandleCommandLineArguments(CommandLineArguments args)
{ {
int i = 0; int i = 0;
@ -278,12 +281,12 @@ namespace ICSharpCode.ILSpy
i++; i++;
} }
} }
LoadAssemblies(args.AssembliesToLoad, commandLineLoadedAssemblies, false); LoadAssemblies(args.AssembliesToLoad, commandLineLoadedAssemblies, focusNode: false);
if (args.Language != null) if (args.Language != null)
sessionSettings.FilterSettings.Language = Languages.GetLanguage(args.Language); sessionSettings.FilterSettings.Language = Languages.GetLanguage(args.Language);
return true; return true;
} }
/// <summary> /// <summary>
/// Called on startup or when passed arguments via WndProc from a second instance. /// Called on startup or when passed arguments via WndProc from a second instance.
/// In the format case, spySettings is non-null; in the latter it is null. /// In the format case, spySettings is non-null; in the latter it is null.
@ -291,14 +294,15 @@ namespace ICSharpCode.ILSpy
void HandleCommandLineArgumentsAfterShowList(CommandLineArguments args, ILSpySettings spySettings = null) void HandleCommandLineArgumentsAfterShowList(CommandLineArguments args, ILSpySettings spySettings = null)
{ {
if (nugetPackagesToLoad.Count > 0) { if (nugetPackagesToLoad.Count > 0) {
LoadAssemblies(nugetPackagesToLoad, commandLineLoadedAssemblies, focusNode: false); var relevantPackages = nugetPackagesToLoad.ToArray();
nugetPackagesToLoad.Clear(); nugetPackagesToLoad.Clear();
// Show the nuget package open dialog after the command line/window message was processed.
Dispatcher.BeginInvoke(new Action(() => LoadAssemblies(relevantPackages, commandLineLoadedAssemblies, focusNode: false)), DispatcherPriority.Normal);
} }
var relevantAssemblies = commandLineLoadedAssemblies.ToList(); var relevantAssemblies = commandLineLoadedAssemblies.ToList();
commandLineLoadedAssemblies.Clear(); // clear references once we don't need them anymore commandLineLoadedAssemblies.Clear(); // clear references once we don't need them anymore
NavigateOnLaunch(args.NavigateTo, sessionSettings.ActiveTreeViewPath, spySettings, relevantAssemblies); NavigateOnLaunch(args.NavigateTo, sessionSettings.ActiveTreeViewPath, spySettings, relevantAssemblies);
if (args.Search != null) if (args.Search != null) {
{
SearchPane.Instance.SearchTerm = args.Search; SearchPane.Instance.SearchTerm = args.Search;
SearchPane.Instance.Show(); SearchPane.Instance.Show();
} }
@ -456,12 +460,12 @@ namespace ICSharpCode.ILSpy
void OpenAssemblies(ILSpySettings spySettings) void OpenAssemblies(ILSpySettings spySettings)
{ {
HandleCommandLineArgumentsAfterShowList(App.CommandLineArguments, spySettings); HandleCommandLineArgumentsAfterShowList(App.CommandLineArguments, spySettings);
AvalonEditTextOutput output = new AvalonEditTextOutput(); AvalonEditTextOutput output = new AvalonEditTextOutput();
if (FormatExceptions(App.StartupExceptions.ToArray(), output)) if (FormatExceptions(App.StartupExceptions.ToArray(), output))
decompilerTextView.ShowText(output); decompilerTextView.ShowText(output);
} }
bool FormatExceptions(App.ExceptionData[] exceptions, ITextOutput output) bool FormatExceptions(App.ExceptionData[] exceptions, ITextOutput output)
{ {
var stringBuilder = new StringBuilder(); var stringBuilder = new StringBuilder();
@ -476,7 +480,7 @@ namespace ICSharpCode.ILSpy
{ {
if (exceptions.Length == 0) return false; if (exceptions.Length == 0) return false;
bool first = true; bool first = true;
foreach (var item in exceptions) { foreach (var item in exceptions) {
if (first) if (first)
first = false; first = false;
@ -492,17 +496,17 @@ namespace ICSharpCode.ILSpy
} else } else
output.AppendLine(item.Exception.ToString()); output.AppendLine(item.Exception.ToString());
} }
return true; return true;
} }
#region Update Check #region Update Check
string updateAvailableDownloadUrl; string updateAvailableDownloadUrl;
public void ShowMessageIfUpdatesAvailableAsync(ILSpySettings spySettings, bool forceCheck = false) public void ShowMessageIfUpdatesAvailableAsync(ILSpySettings spySettings, bool forceCheck = false)
{ {
// Don't check for updates if we're in an MSIX since they work differently // Don't check for updates if we're in an MSIX since they work differently
if(WindowsVersionHelper.HasPackageIdentity) { if (WindowsVersionHelper.HasPackageIdentity) {
return; return;
} }
@ -514,12 +518,12 @@ namespace ICSharpCode.ILSpy
} }
result.ContinueWith(task => AdjustUpdateUIAfterCheck(task, forceCheck), TaskScheduler.FromCurrentSynchronizationContext()); result.ContinueWith(task => AdjustUpdateUIAfterCheck(task, forceCheck), TaskScheduler.FromCurrentSynchronizationContext());
} }
void updatePanelCloseButtonClick(object sender, RoutedEventArgs e) void updatePanelCloseButtonClick(object sender, RoutedEventArgs e)
{ {
updatePanel.Visibility = Visibility.Collapsed; updatePanel.Visibility = Visibility.Collapsed;
} }
void downloadOrCheckUpdateButtonClick(object sender, RoutedEventArgs e) void downloadOrCheckUpdateButtonClick(object sender, RoutedEventArgs e)
{ {
if (updateAvailableDownloadUrl != null) { if (updateAvailableDownloadUrl != null) {
@ -544,30 +548,29 @@ namespace ICSharpCode.ILSpy
} }
} }
#endregion #endregion
public void ShowAssemblyList(string name) public void ShowAssemblyList(string name)
{ {
ILSpySettings settings = ILSpySettings.Load(); ILSpySettings settings = ILSpySettings.Load();
AssemblyList list = this.assemblyListManager.LoadList(settings, name); AssemblyList list = this.assemblyListManager.LoadList(settings, name);
//Only load a new list when it is a different one //Only load a new list when it is a different one
if (list.ListName != CurrentAssemblyList.ListName) if (list.ListName != CurrentAssemblyList.ListName) {
{
ShowAssemblyList(list); ShowAssemblyList(list);
} }
} }
void ShowAssemblyList(AssemblyList assemblyList) void ShowAssemblyList(AssemblyList assemblyList)
{ {
history.Clear(); history.Clear();
this.assemblyList = assemblyList; this.assemblyList = assemblyList;
assemblyList.assemblies.CollectionChanged += assemblyList_Assemblies_CollectionChanged; assemblyList.assemblies.CollectionChanged += assemblyList_Assemblies_CollectionChanged;
assemblyListTreeNode = new AssemblyListTreeNode(assemblyList); assemblyListTreeNode = new AssemblyListTreeNode(assemblyList);
assemblyListTreeNode.FilterSettings = sessionSettings.FilterSettings.Clone(); assemblyListTreeNode.FilterSettings = sessionSettings.FilterSettings.Clone();
assemblyListTreeNode.Select = SelectNode; assemblyListTreeNode.Select = SelectNode;
treeView.Root = assemblyListTreeNode; treeView.Root = assemblyListTreeNode;
if (assemblyList.ListName == AssemblyListManager.DefaultListName) if (assemblyList.ListName == AssemblyListManager.DefaultListName)
#if DEBUG #if DEBUG
this.Title = $"ILSpy {RevisionClass.FullVersion}"; this.Title = $"ILSpy {RevisionClass.FullVersion}";
@ -596,7 +599,7 @@ namespace ICSharpCode.ILSpy
if (CurrentAssemblyListChanged != null) if (CurrentAssemblyListChanged != null)
CurrentAssemblyListChanged(this, e); CurrentAssemblyListChanged(this, e);
} }
void LoadInitialAssemblies() void LoadInitialAssemblies()
{ {
// Called when loading an empty assembly list; so that // Called when loading an empty assembly list; so that
@ -614,7 +617,7 @@ namespace ICSharpCode.ILSpy
foreach (System.Reflection.Assembly asm in initialAssemblies) foreach (System.Reflection.Assembly asm in initialAssemblies)
assemblyList.OpenAssembly(asm.Location); assemblyList.OpenAssembly(asm.Location);
} }
void filterSettings_PropertyChanged(object sender, PropertyChangedEventArgs e) void filterSettings_PropertyChanged(object sender, PropertyChangedEventArgs e)
{ {
RefreshTreeViewFilter(); RefreshTreeViewFilter();
@ -622,7 +625,7 @@ namespace ICSharpCode.ILSpy
DecompileSelectedNodes(recordHistory: false); DecompileSelectedNodes(recordHistory: false);
} }
} }
public void RefreshTreeViewFilter() public void RefreshTreeViewFilter()
{ {
// filterSettings is mutable; but the ILSpyTreeNode filtering assumes that filter settings are immutable. // filterSettings is mutable; but the ILSpyTreeNode filtering assumes that filter settings are immutable.
@ -631,11 +634,11 @@ namespace ICSharpCode.ILSpy
if (assemblyListTreeNode != null) if (assemblyListTreeNode != null)
assemblyListTreeNode.FilterSettings = sessionSettings.FilterSettings.Clone(); assemblyListTreeNode.FilterSettings = sessionSettings.FilterSettings.Clone();
} }
internal AssemblyListTreeNode AssemblyListTreeNode { internal AssemblyListTreeNode AssemblyListTreeNode {
get { return assemblyListTreeNode; } get { return assemblyListTreeNode; }
} }
#region Node Selection #region Node Selection
public void SelectNode(SharpTreeNode obj) public void SelectNode(SharpTreeNode obj)
@ -661,7 +664,7 @@ namespace ICSharpCode.ILSpy
treeView.SetSelectedNodes(nodes); treeView.SetSelectedNodes(nodes);
} }
} }
/// <summary> /// <summary>
/// Retrieves a node using the .ToString() representations of its ancestors. /// Retrieves a node using the .ToString() representations of its ancestors.
/// </summary> /// </summary>
@ -686,7 +689,7 @@ namespace ICSharpCode.ILSpy
else else
return node; return node;
} }
/// <summary> /// <summary>
/// Gets the .ToString() representation of the node's ancestors. /// Gets the .ToString() representation of the node's ancestors.
/// </summary> /// </summary>
@ -702,7 +705,7 @@ namespace ICSharpCode.ILSpy
path.Reverse(); path.Reverse();
return path.ToArray(); return path.ToArray();
} }
public ILSpyTreeNode FindTreeNode(object reference) public ILSpyTreeNode FindTreeNode(object reference)
{ {
switch (reference) { switch (reference) {
@ -724,12 +727,12 @@ namespace ICSharpCode.ILSpy
return null; return null;
} }
} }
public void JumpToReference(object reference) public void JumpToReference(object reference)
{ {
JumpToReferenceAsync(reference).HandleExceptions(); JumpToReferenceAsync(reference).HandleExceptions();
} }
/// <summary> /// <summary>
/// Jumps to the specified reference. /// Jumps to the specified reference.
/// </summary> /// </summary>
@ -800,7 +803,7 @@ namespace ICSharpCode.ILSpy
{ {
if (fileNames == null) if (fileNames == null)
throw new ArgumentNullException(nameof(fileNames)); throw new ArgumentNullException(nameof(fileNames));
if (focusNode) if (focusNode)
treeView.UnselectAll(); treeView.UnselectAll();
@ -813,24 +816,29 @@ namespace ICSharpCode.ILSpy
foreach (string file in fileNames) { foreach (string file in fileNames) {
switch (Path.GetExtension(file)) { switch (Path.GetExtension(file)) {
case ".nupkg": case ".nupkg":
LoadedNugetPackage package = new LoadedNugetPackage(file); this.handlingNugetPackageSelection = true;
var selectionDialog = new NugetPackageBrowserDialog(package); try {
selectionDialog.Owner = this; LoadedNugetPackage package = new LoadedNugetPackage(file);
if (selectionDialog.ShowDialog() != true) var selectionDialog = new NugetPackageBrowserDialog(package);
break; selectionDialog.Owner = this;
foreach (var entry in selectionDialog.SelectedItems) { if (selectionDialog.ShowDialog() != true)
var nugetAsm = assemblyList.OpenAssembly("nupkg://" + file + ";" + entry.Name, entry.Stream, true); break;
if (nugetAsm != null) { foreach (var entry in selectionDialog.SelectedItems) {
if (loadedAssemblies != null) var nugetAsm = assemblyList.OpenAssembly("nupkg://" + file + ";" + entry.Name, entry.Stream, true);
loadedAssemblies.Add(nugetAsm); if (nugetAsm != null) {
else { if (loadedAssemblies != null)
var node = assemblyListTreeNode.FindAssemblyNode(nugetAsm); loadedAssemblies.Add(nugetAsm);
if (node != null && focusNode) { else {
treeView.SelectedItems.Add(node); var node = assemblyListTreeNode.FindAssemblyNode(nugetAsm);
lastNode = node; if (node != null && focusNode) {
treeView.SelectedItems.Add(node);
lastNode = node;
}
} }
} }
} }
} finally {
this.handlingNugetPackageSelection = false;
} }
break; break;
default: default:
@ -853,7 +861,7 @@ namespace ICSharpCode.ILSpy
treeView.FocusNode(lastNode); treeView.FocusNode(lastNode);
} }
} }
void RefreshCommandExecuted(object sender, ExecutedRoutedEventArgs e) void RefreshCommandExecuted(object sender, ExecutedRoutedEventArgs e)
{ {
try { try {
@ -865,13 +873,13 @@ namespace ICSharpCode.ILSpy
refreshInProgress = false; refreshInProgress = false;
} }
} }
void SearchCommandExecuted(object sender, ExecutedRoutedEventArgs e) void SearchCommandExecuted(object sender, ExecutedRoutedEventArgs e)
{ {
SearchPane.Instance.Show(); SearchPane.Instance.Show();
} }
#endregion #endregion
#region Decompile (TreeView_SelectionChanged) #region Decompile (TreeView_SelectionChanged)
void TreeView_SelectionChanged(object sender, SelectionChangedEventArgs e) void TreeView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{ {
@ -880,10 +888,10 @@ namespace ICSharpCode.ILSpy
if (SelectionChanged != null) if (SelectionChanged != null)
SelectionChanged(sender, e); SelectionChanged(sender, e);
} }
Task decompilationTask; Task decompilationTask;
bool ignoreDecompilationRequests; bool ignoreDecompilationRequests;
void DecompileSelectedNodes(DecompilerTextViewState state = null, bool recordHistory = true) void DecompileSelectedNodes(DecompilerTextViewState state = null, bool recordHistory = true)
{ {
if (ignoreDecompilationRequests) if (ignoreDecompilationRequests)
@ -891,14 +899,14 @@ namespace ICSharpCode.ILSpy
if (treeView.SelectedItems.Count == 0 && refreshInProgress) if (treeView.SelectedItems.Count == 0 && refreshInProgress)
return; return;
if (recordHistory) { if (recordHistory) {
var dtState = decompilerTextView.GetState(); var dtState = decompilerTextView.GetState();
if(dtState != null) if (dtState != null)
history.UpdateCurrent(new NavigationState(dtState)); history.UpdateCurrent(new NavigationState(dtState));
history.Record(new NavigationState(treeView.SelectedItems.OfType<SharpTreeNode>())); history.Record(new NavigationState(treeView.SelectedItems.OfType<SharpTreeNode>()));
} }
if (treeView.SelectedItems.Count == 1) { if (treeView.SelectedItems.Count == 1) {
ILSpyTreeNode node = treeView.SelectedItem as ILSpyTreeNode; ILSpyTreeNode node = treeView.SelectedItem as ILSpyTreeNode;
if (node != null && node.View(decompilerTextView)) if (node != null && node.View(decompilerTextView))
@ -927,7 +935,7 @@ namespace ICSharpCode.ILSpy
refreshInProgress = false; refreshInProgress = false;
} }
} }
public DecompilerTextView TextView { public DecompilerTextView TextView {
get { return decompilerTextView; } get { return decompilerTextView; }
} }
@ -950,7 +958,7 @@ namespace ICSharpCode.ILSpy
e.Handled = true; e.Handled = true;
e.CanExecute = history.CanNavigateBack; e.CanExecute = history.CanNavigateBack;
} }
void BackCommandExecuted(object sender, ExecutedRoutedEventArgs e) void BackCommandExecuted(object sender, ExecutedRoutedEventArgs e)
{ {
if (history.CanNavigateBack) { if (history.CanNavigateBack) {
@ -958,13 +966,13 @@ namespace ICSharpCode.ILSpy
NavigateHistory(false); NavigateHistory(false);
} }
} }
void ForwardCommandCanExecute(object sender, CanExecuteRoutedEventArgs e) void ForwardCommandCanExecute(object sender, CanExecuteRoutedEventArgs e)
{ {
e.Handled = true; e.Handled = true;
e.CanExecute = history.CanNavigateForward; e.CanExecute = history.CanNavigateForward;
} }
void ForwardCommandExecuted(object sender, ExecutedRoutedEventArgs e) void ForwardCommandExecuted(object sender, ExecutedRoutedEventArgs e)
{ {
if (history.CanNavigateForward) { if (history.CanNavigateForward) {
@ -972,18 +980,17 @@ namespace ICSharpCode.ILSpy
NavigateHistory(true); NavigateHistory(true);
} }
} }
void NavigateHistory(bool forward) void NavigateHistory(bool forward)
{ {
var dtState = decompilerTextView.GetState(); var dtState = decompilerTextView.GetState();
if(dtState != null) if (dtState != null)
history.UpdateCurrent(new NavigationState(dtState)); history.UpdateCurrent(new NavigationState(dtState));
var newState = forward ? history.GoForward() : history.GoBack(); var newState = forward ? history.GoForward() : history.GoBack();
ignoreDecompilationRequests = true; ignoreDecompilationRequests = true;
treeView.SelectedItems.Clear(); treeView.SelectedItems.Clear();
foreach (var node in newState.TreeNodes) foreach (var node in newState.TreeNodes) {
{
treeView.SelectedItems.Add(node); treeView.SelectedItems.Add(node);
} }
if (newState.TreeNodes.Any()) if (newState.TreeNodes.Any())
@ -991,9 +998,9 @@ namespace ICSharpCode.ILSpy
ignoreDecompilationRequests = false; ignoreDecompilationRequests = false;
DecompileSelectedNodes(newState.ViewState, false); DecompileSelectedNodes(newState.ViewState, false);
} }
#endregion #endregion
protected override void OnStateChanged(EventArgs e) protected override void OnStateChanged(EventArgs e)
{ {
base.OnStateChanged(e); base.OnStateChanged(e);
@ -1001,7 +1008,7 @@ namespace ICSharpCode.ILSpy
if (this.WindowState != System.Windows.WindowState.Minimized) if (this.WindowState != System.Windows.WindowState.Minimized)
sessionSettings.WindowState = this.WindowState; sessionSettings.WindowState = this.WindowState;
} }
protected override void OnClosing(CancelEventArgs e) protected override void OnClosing(CancelEventArgs e)
{ {
base.OnClosing(e); base.OnClosing(e);
@ -1032,7 +1039,7 @@ namespace ICSharpCode.ILSpy
return loadedAssy.FileName; return loadedAssy.FileName;
} }
#region Top/Bottom Pane management #region Top/Bottom Pane management
/// <summary> /// <summary>
@ -1046,14 +1053,12 @@ namespace ICSharpCode.ILSpy
var pane2Height = pane2Row.Height; var pane2Height = pane2Row.Height;
//only star height values are normalized. //only star height values are normalized.
if (!pane1Height.IsStar || !pane2Height.IsStar) if (!pane1Height.IsStar || !pane2Height.IsStar) {
{
return; return;
} }
var totalHeight = pane1Height.Value + pane2Height.Value; var totalHeight = pane1Height.Value + pane2Height.Value;
if (totalHeight == 0) if (totalHeight == 0) {
{
return; return;
} }
@ -1080,20 +1085,20 @@ namespace ICSharpCode.ILSpy
} }
topPane.Visibility = Visibility.Visible; topPane.Visibility = Visibility.Visible;
} }
void TopPane_CloseButtonClicked(object sender, EventArgs e) void TopPane_CloseButtonClicked(object sender, EventArgs e)
{ {
sessionSettings.TopPaneSplitterPosition = topPaneRow.Height.Value / (topPaneRow.Height.Value + textViewRow.Height.Value); sessionSettings.TopPaneSplitterPosition = topPaneRow.Height.Value / (topPaneRow.Height.Value + textViewRow.Height.Value);
topPaneRow.MinHeight = 0; topPaneRow.MinHeight = 0;
topPaneRow.Height = new GridLength(0); topPaneRow.Height = new GridLength(0);
topPane.Visibility = Visibility.Collapsed; topPane.Visibility = Visibility.Collapsed;
IPane pane = topPane.Content as IPane; IPane pane = topPane.Content as IPane;
topPane.Content = null; topPane.Content = null;
if (pane != null) if (pane != null)
pane.Closed(); pane.Closed();
} }
public void ShowInBottomPane(string title, object content) public void ShowInBottomPane(string title, object content)
{ {
bottomPaneRow.MinHeight = 100; bottomPaneRow.MinHeight = 100;
@ -1113,26 +1118,26 @@ namespace ICSharpCode.ILSpy
} }
bottomPane.Visibility = Visibility.Visible; bottomPane.Visibility = Visibility.Visible;
} }
void BottomPane_CloseButtonClicked(object sender, EventArgs e) void BottomPane_CloseButtonClicked(object sender, EventArgs e)
{ {
sessionSettings.BottomPaneSplitterPosition = bottomPaneRow.Height.Value / (bottomPaneRow.Height.Value + textViewRow.Height.Value); sessionSettings.BottomPaneSplitterPosition = bottomPaneRow.Height.Value / (bottomPaneRow.Height.Value + textViewRow.Height.Value);
bottomPaneRow.MinHeight = 0; bottomPaneRow.MinHeight = 0;
bottomPaneRow.Height = new GridLength(0); bottomPaneRow.Height = new GridLength(0);
bottomPane.Visibility = Visibility.Collapsed; bottomPane.Visibility = Visibility.Collapsed;
IPane pane = bottomPane.Content as IPane; IPane pane = bottomPane.Content as IPane;
bottomPane.Content = null; bottomPane.Content = null;
if (pane != null) if (pane != null)
pane.Closed(); pane.Closed();
} }
#endregion #endregion
public void UnselectAll() public void UnselectAll()
{ {
treeView.UnselectAll(); treeView.UnselectAll();
} }
public void SetStatus(string status, Brush foreground) public void SetStatus(string status, Brush foreground)
{ {
if (this.statusBar.Visibility == Visibility.Collapsed) if (this.statusBar.Visibility == Visibility.Collapsed)
@ -1140,12 +1145,12 @@ namespace ICSharpCode.ILSpy
this.StatusLabel.Foreground = foreground; this.StatusLabel.Foreground = foreground;
this.StatusLabel.Text = status; this.StatusLabel.Text = status;
} }
public ItemCollection GetMainMenuItems() public ItemCollection GetMainMenuItems()
{ {
return mainMenu.Items; return mainMenu.Items;
} }
public ItemCollection GetToolBarItems() public ItemCollection GetToolBarItems()
{ {
return toolBar.Items; return toolBar.Items;

2
ILSpy/Properties/AssemblyInfo.template.cs

@ -39,7 +39,7 @@ internal static class RevisionClass
public const string Minor = "0"; public const string Minor = "0";
public const string Build = "0"; public const string Build = "0";
public const string Revision = "$INSERTREVISION$"; public const string Revision = "$INSERTREVISION$";
public const string VersionName = "rc1"; public const string VersionName = null;
public const string FullVersion = Major + "." + Minor + "." + Build + ".$INSERTREVISION$$INSERTBRANCHPOSTFIX$$INSERTVERSIONNAMEPOSTFIX$"; public const string FullVersion = Major + "." + Minor + "." + Build + ".$INSERTREVISION$$INSERTBRANCHPOSTFIX$$INSERTVERSIONNAMEPOSTFIX$";
} }

9
ILSpy/Properties/Resources.Designer.cs generated

@ -511,6 +511,15 @@ namespace ICSharpCode.ILSpy.Properties {
} }
} }
/// <summary>
/// Looks up a localized string similar to Always show enum member values.
/// </summary>
public static string DecompilerSettings_AlwaysShowEnumMemberValues {
get {
return ResourceManager.GetString("DecompilerSettings.AlwaysShowEnumMemberValues", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Always use braces. /// Looks up a localized string similar to Always use braces.
/// </summary> /// </summary>

3
ILSpy/Properties/Resources.resx

@ -754,6 +754,9 @@ Are you sure you want to continue?</value>
<data name="DecompilerSettings.RemoveDeadStores" xml:space="preserve"> <data name="DecompilerSettings.RemoveDeadStores" xml:space="preserve">
<value>Remove dead stores (use with caution!)</value> <value>Remove dead stores (use with caution!)</value>
</data> </data>
<data name="DecompilerSettings.AlwaysShowEnumMemberValues" xml:space="preserve">
<value>Always show enum member values</value>
</data>
<data name="ShowPublicOnlyTypesMembers" xml:space="preserve"> <data name="ShowPublicOnlyTypesMembers" xml:space="preserve">
<value>Show only public types and members</value> <value>Show only public types and members</value>
</data> </data>

4
README.md

@ -2,7 +2,7 @@
ILSpy is the open-source .NET assembly browser and decompiler. ILSpy is the open-source .NET assembly browser and decompiler.
Download: [latest release](https://github.com/icsharpcode/ILSpy/releases) | [latest CI build (master)](https://ci.appveyor.com/api/projects/icsharpcode/ilspy/artifacts/ILSpy_binaries.zip?branch=master&job=Configuration%3A+Release) Download: [latest release](https://github.com/icsharpcode/ILSpy/releases) | [latest CI build (master)](https://ci.appveyor.com/api/projects/icsharpcode/ilspy/artifacts/ILSpy_binaries.zip?branch=master&job=Configuration%3A+Release) | [Microsoft Store (RC & RTM versions only)](https://www.microsoft.com/store/apps/9MXFBKFVSQ13)
CI Build Nuget Feed (master): https://ci.appveyor.com/nuget/ilspy-masterfeed CI Build Nuget Feed (master): https://ci.appveyor.com/nuget/ilspy-masterfeed
@ -11,7 +11,7 @@ Decompiler Frontends
Aside from the WPF UI ILSpy (downloadable via Releases, see also [plugins](https://github.com/icsharpcode/ILSpy/wiki/Plugins)), the following other frontends are available: Aside from the WPF UI ILSpy (downloadable via Releases, see also [plugins](https://github.com/icsharpcode/ILSpy/wiki/Plugins)), the following other frontends are available:
* Visual Studio 2017 extension [marketplace](https://marketplace.visualstudio.com/items?itemName=SharpDevelopTeam.ILSpy) * Visual Studio 2017/2019 extension [marketplace](https://marketplace.visualstudio.com/items?itemName=SharpDevelopTeam.ILSpy)
* Visual Studio Code Extension [repository](https://github.com/icsharpcode/ilspy-vscode) | [marketplace](https://marketplace.visualstudio.com/items?itemName=icsharpcode.ilspy-vscode) * Visual Studio Code Extension [repository](https://github.com/icsharpcode/ilspy-vscode) | [marketplace](https://marketplace.visualstudio.com/items?itemName=icsharpcode.ilspy-vscode)
* [ICSharpCode.Decompiler](https://www.nuget.org/packages/ICSharpCode.Decompiler/) NuGet for your own projects * [ICSharpCode.Decompiler](https://www.nuget.org/packages/ICSharpCode.Decompiler/) NuGet for your own projects
* Linux/Mac/Windows ILSpy UI based on [Avalonia](http://www.avaloniaui.net/) - check out https://github.com/icsharpcode/AvaloniaILSpy * Linux/Mac/Windows ILSpy UI based on [Avalonia](http://www.avaloniaui.net/) - check out https://github.com/icsharpcode/AvaloniaILSpy

2
azure-pipelines.yml

@ -9,7 +9,7 @@ pr:
variables: variables:
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
BuildPlatform: Any CPU BuildPlatform: Any CPU
jobs: jobs:
- job: Build - job: Build

2
global.json

@ -3,6 +3,6 @@
"MSBuild.Sdk.Extras": "2.0.24" "MSBuild.Sdk.Extras": "2.0.24"
}, },
"sdk": { "sdk": {
"version": "3.0.100-preview9" "version": "3.0.100-rc1"
} }
} }

Loading…
Cancel
Save