Skip to content

Commit

Permalink
Merge pull request #9 from BlaiseD/DotNet5TheDesigner
Browse files Browse the repository at this point in the history
Made the designer and type loading .Net 5 compatible.
  • Loading branch information
BlaiseD authored Mar 30, 2021
2 parents 62a4213 + 5115740 commit fe5ec4a
Show file tree
Hide file tree
Showing 25 changed files with 416 additions and 418 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ jobs:
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: 3.1.302
dotnet-version: 5.0.201
source-url: https://nuget.pkg.github.com/blaised/index.json
env:
NUGET_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Expand Down Expand Up @@ -53,14 +53,14 @@ jobs:
- name: Build and push LogicBuilder.Workflow.Activities.Rules.Design
env:
PROJECT_NAME: LogicBuilder.Workflow.Activities.Rules.Design
run: ./CI_Build_Push_Design.ps1
run: ./CI_Build_Push.ps1
shell: pwsh

- name: Restore
run: dotnet restore

- name: Build
run: dotnet build --configuration Release --no-restore
run: dotnet build --configuration Release

- name: Test
run: dotnet test --no-restore --verbosity normal --filter "UnitTests.NetFramework.NetFrameworkRulesTests|UnitTests.NetCore.NetCoreRulesTests"
6 changes: 3 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: 3.1.302
dotnet-version: 5.0.201
source-url: https://nuget.pkg.github.com/blaised/index.json
env:
NUGET_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Expand Down Expand Up @@ -48,7 +48,7 @@ jobs:
run: dotnet restore

- name: Build
run: dotnet build --configuration Release --no-restore
run: dotnet build --configuration Release

- name: Test
run: dotnet test --no-restore --verbosity normal --filter "UnitTests.NetFramework.NetFrameworkRulesTests|UnitTests.NetCore.NetCoreRulesTests"
Expand All @@ -62,5 +62,5 @@ jobs:
- name: Build and push LogicBuilder.Workflow.Activities.Rules.Design
env:
PROJECT_NAME: LogicBuilder.Workflow.Activities.Rules.Design
run: ./Release_Build_Push_Design.ps1
run: ./Release_Build_Push.ps1
shell: pwsh
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>

<ItemGroup>
Expand Down
22 changes: 21 additions & 1 deletion Console.SampleFlow.NetCore.DefineAndSerialize/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using Microsoft.Extensions.Configuration;
using System.CodeDom;
using System.IO;
using System.Text.RegularExpressions;

namespace Console.SampleFlow.NetCore.DefineAndSerialize
{
Expand Down Expand Up @@ -688,7 +689,26 @@ private static string SerializeRules(object drs)
stringWriter.Flush();
}

return ruleDefinition.ToString();
return UpdateStrongNames(ruleDefinition.ToString());
}

private static string UpdateStrongNames(string ruleSetXml)
{
if (ruleSetXml == null) return null;

ruleSetXml = Regex.Replace(ruleSetXml, AssemblyStrongNames.NETCORE_MATCH, AssemblyStrongNames.NETCORE);
ruleSetXml = Regex.Replace(ruleSetXml, AssemblyStrongNames.CODEDOM_NETCORE_MATCH, AssemblyStrongNames.CODEDOM_NETCORE);

return ruleSetXml;
}
}

internal struct AssemblyStrongNames
{
internal const string NETCORE = "System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e";
internal const string CODEDOM_NETCORE = "System.CodeDom, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51";

internal const string NETCORE_MATCH = @"System.Private.CoreLib, Version=\d.\d.\d.\d, Culture=neutral, PublicKeyToken=7cec85d7bea7798e";
internal const string CODEDOM_NETCORE_MATCH = @"System.CodeDom, Version=\d.\d.\d.\d, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<RootNamespace>LogicBuilder.ComponentModel.Design.Serialization</RootNamespace>
<Description>Implements DesignerSerializationManager for .NetStandard.</Description>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<PackageReleaseNotes>Allow the client to supply reference assemblies because .Net Native does not allow calls to Assembly.GetReferencedAssemblies().</PackageReleaseNotes>
<PackageReleaseNotes>Made the designer and type loading .Net 5 compatible.</PackageReleaseNotes>
<PackageTags>serialization</PackageTags>
<Copyright>Copyright © Microsoft 2017</Copyright>
<RepositoryUrl>https://github.com/BlaiseD/LogicBuilder.Rules</RepositoryUrl>
Expand Down
98 changes: 44 additions & 54 deletions LogicBuilder.RuleSetToolkit/AssemblyLoader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,18 @@
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.Loader;
using System.Security;

namespace LogicBuilder.RuleSetToolkit
{
internal class AssemblyLoader
{
internal AssemblyLoader(string assemblyFullName, string[] paths)
internal AssemblyLoader(string assemblyFullName, string[] paths, ToolkitAssemblyLoadContext assemblyLoadContext)
{
this.assemblyFullName = assemblyFullName;
this.paths = paths;
Initialize();
this.assemblyLoadContext = assemblyLoadContext;
}

#region Constants
Expand All @@ -25,50 +26,13 @@ internal AssemblyLoader(string assemblyFullName, string[] paths)
#region Variables
private string assemblyFullName;
private string[] paths;
private ToolkitAssemblyLoadContext assemblyLoadContext;
#endregion Variables

#region Properties
#endregion Properties

#region Methods
private void Initialize()
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}

/// <summary>
/// Loads unresolved assembly i.e. referenced assembly not found in GAC or otherwise.
/// This method searches the local directory of the assemblyFullName assembly.
/// </summary>
/// <param name="failedAssemblyStrongName"></param>
/// <returns></returns>
private Assembly ResolveAssembly(string failedAssemblyStrongName)
{
string assemblyName = failedAssemblyStrongName.Contains(COMMA) ? failedAssemblyStrongName.Substring(0, failedAssemblyStrongName.IndexOf(COMMA, StringComparison.Ordinal)) : failedAssemblyStrongName;
LinkedList<string> path = new LinkedList<string>(this.GetPaths());
try
{
return LoadAssembly(path.First, string.Concat(assemblyName, DOTDLL));
}
catch (FileLoadException ex)
{
throw new ToolkitException(ex.Message, ex);
}
catch (ArgumentNullException ex)
{
throw new ToolkitException(ex.Message, ex);
}
catch (BadImageFormatException ex)
{
throw new ToolkitException(ex.Message, ex);
}
catch (FileNotFoundException ex)
{
throw new ToolkitException(ex.Message, ex);
}
}

/// <summary>
/// Given the fully qualified class name, returns the type form the assemblyFullName assembly
/// </summary>
Expand Down Expand Up @@ -123,7 +87,7 @@ internal Assembly LoadAssembly()
try
{
if (File.Exists(this.assemblyFullName))
assembly = Assembly.LoadFile(this.assemblyFullName);
assembly = assemblyLoadContext.LoadFromFileStream(this.assemblyFullName);
}
catch (FileLoadException ex)
{
Expand All @@ -145,6 +109,42 @@ internal Assembly LoadAssembly()
return assembly;
}

internal static Type[] GetTypes(Assembly assembly)
{
List<Type> types = new List<Type>();
try
{
types.AddRange(typeof(string).Assembly.GetTypes());
types.AddRange(assembly.GetTypes());
}
catch (ReflectionTypeLoadException e)
{
types.AddRange(e.Types);
}
catch (ArgumentException ex)
{
throw new ToolkitException(ex.Message, ex);
}
catch (SecurityException ex)
{
throw new ToolkitException(ex.Message, ex);
}
catch (FileLoadException ex)
{
throw new ToolkitException(ex.Message, ex);
}
catch (FileNotFoundException ex)
{
throw new ToolkitException(ex.Message, ex);
}
catch (TypeLoadException ex)
{
throw new ToolkitException(ex.Message, ex);
}

return types.ToArray();
}

/// <summary>
/// Returns the assembly
/// </summary>
Expand All @@ -154,13 +154,12 @@ internal Assembly LoadAssembly(AssemblyName assemblyName)
if (assemblyName == null)
return null;


Assembly assembly = null;
Assembly assembly;
LinkedList<string> path = new LinkedList<string>(this.GetPaths());
try
{
string name = assemblyName.FullName.Contains(COMMA) ? assemblyName.FullName.Substring(0, assemblyName.FullName.IndexOf(COMMA, StringComparison.Ordinal)) : assemblyName.FullName;
assembly = LoadAssembly(path.First, string.Concat(name, DOTDLL)) ?? Assembly.Load(assemblyName.FullName);
assembly = LoadAssembly(path.First, string.Concat(name, DOTDLL)) ?? this.assemblyLoadContext.LoadFromAssemblyName(assemblyName);
}
catch (IOException ex)
{
Expand Down Expand Up @@ -212,21 +211,12 @@ private Assembly LoadAssembly(LinkedListNode<string> path, string file)
{
string fullName = Path.Combine(path.Value, file);
if (File.Exists(fullName))
return Assembly.LoadFile(fullName);
return assemblyLoadContext.LoadFromFileStream(fullName);
else if (path.Next != null)
return LoadAssembly(path.Next, file);
else
return null;
}
#endregion Private Methods
#region EventHandlers
private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
if (string.IsNullOrEmpty(this.assemblyFullName))
return null;
else
return ResolveAssembly(args.Name);
}
#endregion EventHandlers
}
}
49 changes: 49 additions & 0 deletions LogicBuilder.RuleSetToolkit/Helpers.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

namespace LogicBuilder.RuleSetToolkit
{
internal static class Helpers
{
public static List<Assembly> GetReferencedAssembliesRecursively(this Assembly assembly, AssemblyLoader assemblyLoader)
{
Dictionary<string, Assembly> assemblies = new Dictionary<string, Assembly>
{
{ assembly.FullName, assembly }
};

GetReferencedAssembliesRecursively(assembly, assemblies, assemblyLoader);

return assemblies.Values.ToList();
}

public static void GetReferencedAssembliesRecursively(this Assembly assembly, Dictionary<string, Assembly> assemblies, AssemblyLoader assemblyLoader)
=> assembly.GetReferencedAssemblies()
.ToList()
.ForEach
(
assemblyName =>
{
Assembly asm = null;
try
{
asm = assemblyLoader.LoadAssembly(assemblyName);
}
catch (Exception)
{
}
if (asm == null)
return;
if (!assemblies.ContainsKey(asm.FullName))
{
assemblies.Add(asm.FullName, asm);
GetReferencedAssembliesRecursively(asm, assemblies, assemblyLoader);
}
}
);
}
}
Loading

0 comments on commit fe5ec4a

Please sign in to comment.