Skip to content
This repository was archived by the owner on Jul 21, 2022. It is now read-only.

Commit bf6eed5

Browse files
author
Michal Ciechan
committed
Upgraded and working for net5.0 client folder
1 parent 01b0873 commit bf6eed5

3 files changed

Lines changed: 181 additions & 38 deletions

File tree

src/RazorComponentsPreview/Razor/Generator.cs

Lines changed: 112 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,30 @@ public Generator()
2323

2424
GC.KeepAlive(typeof(EditForm));
2525

26-
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
26+
var currentAssemblies = AppDomain.CurrentDomain.GetAssemblies();
27+
28+
var assembliesToProcess = new Queue<Assembly>(currentAssemblies);
29+
30+
var seenAssemblies = new Dictionary<string, Assembly>();
31+
32+
LoadAssemblies(assembliesToProcess, seenAssemblies);
33+
34+
LoadAllNetFrameworkAssemblies(seenAssemblies);
35+
36+
LoadWebAssemblyAssembliesIfMissing(seenAssemblies);
37+
38+
var wa = seenAssemblies.Keys.Where(x => x.Contains("WebAsse")).ToList();
39+
40+
var assembliesToReference =
41+
seenAssemblies.Values.Where(assembly => !assembly.IsDynamic && assembly.Location != null)
42+
.ToList();
43+
44+
var httpA = assembliesToReference.Where(x => x.FullName.Contains("System")).OrderBy(x => x.FullName);
45+
46+
47+
foreach (var assembly in assembliesToReference)
2748
{
28-
if (!assembly.IsDynamic && assembly.Location != null)
29-
{
30-
References.Add(MetadataReference.CreateFromFile(assembly.Location));
31-
}
49+
References.Add(MetadataReference.CreateFromFile(assembly.Location));
3250
}
3351

3452
BaseCompilation = CSharpCompilation.Create(
@@ -47,6 +65,95 @@ public Generator()
4765
});
4866
}
4967

68+
private void LoadWebAssemblyAssembliesIfMissing(Dictionary<string, Assembly> loadedAssemblies)
69+
{
70+
// This seems to be referenced
71+
// C:\Users\xxx\.nuget\packages\microsoft.aspnetcore.components.webassembly.server\5.0.0-preview.8.20414.8\lib\net5.0
72+
73+
// Therefore we infer the following from above, using the same nuget package version
74+
// C:\Users\xxx\.nuget\packages\microsoft.aspnetcore.components.webassembly\5.0.0-preview.8.20414.8\lib\net5.0
75+
var webAssemblyServer = loadedAssemblies["Microsoft.AspNetCore.Components.WebAssembly.Server"];
76+
77+
var webAssemblyLocation = webAssemblyServer.Location.Replace(
78+
"microsoft.aspnetcore.components.webassembly.server",
79+
"microsoft.aspnetcore.components.webassembly",
80+
StringComparison.OrdinalIgnoreCase);
81+
82+
var webAssemblyDir = Directory.GetParent(webAssemblyLocation);
83+
84+
LoadAssembliesFromDirectory(webAssemblyDir, loadedAssemblies);
85+
}
86+
87+
88+
// TODO: better error handling if for whatever reason cant be found
89+
private void LoadAllNetFrameworkAssemblies(Dictionary<string, Assembly> seenAssemblies)
90+
{
91+
var systemNetHttpLocation = seenAssemblies["System.Net.Http"].Location;
92+
93+
var netFxFolder = Directory.GetParent(systemNetHttpLocation);
94+
95+
LoadAssembliesFromDirectory(netFxFolder, seenAssemblies);
96+
}
97+
98+
private void LoadAssembliesFromDirectory(DirectoryInfo directory, Dictionary<string, Assembly> seenAssemblies)
99+
{
100+
var assemblyQueue = new Queue<Assembly>();
101+
102+
foreach (var file in directory.GetFiles("*.dll"))
103+
{
104+
AssemblyName assemblyName;
105+
try
106+
{
107+
assemblyName = AssemblyName.GetAssemblyName(file.FullName);
108+
}
109+
catch (Exception e)
110+
{
111+
Console.WriteLine(
112+
$"Could not get assembly name for '{file.FullName}'. Skipping. Exception:\r\n{e}");
113+
continue;
114+
}
115+
116+
if (seenAssemblies.ContainsKey(assemblyName.Name))
117+
continue;
118+
119+
var assembly = Assembly.Load(assemblyName);
120+
121+
assemblyQueue.Enqueue(assembly);
122+
}
123+
124+
LoadAssemblies(assemblyQueue, seenAssemblies);
125+
}
126+
127+
private void LoadAssemblies(Queue<Assembly> assembliesToLoad, Dictionary<string, Assembly> loadedAssemblies)
128+
{
129+
while (assembliesToLoad.TryDequeue(out var assembly))
130+
{
131+
var assemblyName = assembly.GetName().Name;
132+
133+
if (!loadedAssemblies.TryAdd(assemblyName, assembly)) continue;
134+
135+
var refAssemblies = assembly.GetReferencedAssemblies();
136+
137+
foreach (var refAssemblyName in refAssemblies)
138+
{
139+
if (loadedAssemblies.ContainsKey(refAssemblyName.Name)) continue;
140+
141+
Assembly refAssembly;
142+
try
143+
{
144+
refAssembly = Assembly.Load(refAssemblyName);
145+
}
146+
catch (Exception e)
147+
{
148+
Console.WriteLine($"Could not load Referenced Assembly '{refAssemblyName}'. Skipping. Exception:\r\n{e}");
149+
continue;
150+
}
151+
152+
assembliesToLoad.Enqueue(refAssembly);
153+
}
154+
}
155+
}
156+
50157
private RazorProjectEngine Engine { get; }
51158
private TestRazorProjectFileSystem FileSystem { get; }
52159
private Dictionary<string, string> Declarations { get; }

src/RazorComponentsPreview/Razor/RuntimeComponentsGenerator.cs

Lines changed: 63 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.IO;
44
using System.Linq;
55
using System.Net.WebSockets;
6+
using System.Reflection;
67
using System.Runtime.Loader;
78
using System.Text;
89
using System.Text.RegularExpressions;
@@ -23,7 +24,7 @@ public class RuntimeComponentsGenerator
2324
{
2425
public IServiceCollection _serviceCollection { get; set; }
2526
public Generator _generator { get; set; }
26-
public string _fileSystemPath { get; set; } = Directory.GetCurrentDirectory();
27+
public string _fileSystemPath { get; set; } = Directory.GetParent(Directory.GetCurrentDirectory()).GetDirectories("Client").Single().ToString();
2728
public WebSocket _webSocket { get; set; }
2829
public FileSystemWatcher _watcher { get; set; }
2930
public string _CurrentRoute { get; set; } = "/";
@@ -47,7 +48,14 @@ public string FirstTimeRender()
4748
{
4849
var html = RenderRazorFileToHtml("index"); // Todo handle case : if there is not index.razor file in project
4950
var wrapedhtml = WrapHostTemplate(html);
50-
File.WriteAllText("wwwroot/preview.html", wrapedhtml);
51+
52+
var wwwroots = Directory.GetDirectories(_fileSystemPath, "wwwroot", SearchOption.AllDirectories);
53+
54+
wwwroots = wwwroots.Where(x => !x.Contains("bin")).ToArray();
55+
56+
var previewFile = Path.Combine(wwwroots.Single(), "preview.html");
57+
58+
File.WriteAllText(previewFile, wrapedhtml);
5159
return wrapedhtml;
5260
}
5361
catch (Exception ex)
@@ -63,35 +71,35 @@ public void AttachWebsocket(WebSocket webSocket)
6371
private List<string> GetAllFileNames()
6472
{
6573
var razorFiles = Directory.GetFiles(_fileSystemPath, "*.razor", SearchOption.AllDirectories).ToList();
66-
var item1 = razorFiles.SingleOrDefault(item => item.Contains("_Imports.razor"));
67-
razorFiles.Remove(item1);
74+
// var item1 = razorFiles.SingleOrDefault(item => item.Contains("_Imports.razor"));
75+
// razorFiles.Remove(item1);
6876
return razorFiles;
6977
}
7078
private static List<(string FilePath, string Content)> ReadAllFiles(List<string> razorFiles)
7179
{
7280
var files = razorFiles.Select(item => (FilePath: "/" + Path.GetFileName(item), Content: File.ReadAllText(item))).ToList();
73-
var razorImportsFile = ("/_Imports.razor", @"
74-
@using System.Net.Http
75-
@using Microsoft.AspNetCore.Authorization
76-
@using Microsoft.AspNetCore.Components.Authorization
77-
@using Microsoft.AspNetCore.Components.Forms
78-
@using Microsoft.AspNetCore.Components.Routing
79-
@using Microsoft.AspNetCore.Components.Web
80-
@using Microsoft.JSInterop
81-
@using Test
82-
@namespace Test
83-
"); // Todo handle better way _Imports.razor file.
84-
files.Insert(0, razorImportsFile);
81+
// var razorImportsFile = ("/_Imports.razor", @"
82+
// @using System.Net.Http
83+
// @using Microsoft.AspNetCore.Authorization
84+
// @using Microsoft.AspNetCore.Components.Authorization
85+
// @using Microsoft.AspNetCore.Components.Forms
86+
// @using Microsoft.AspNetCore.Components.Routing
87+
// @using Microsoft.AspNetCore.Components.Web
88+
// @using Microsoft.JSInterop
89+
// @using Test
90+
// @namespace Test
91+
// "); // Todo handle better way _Imports.razor file.
92+
// files.Insert(0, razorImportsFile);
8593

8694
//hack for to get dependencies from Test
87-
var appRazorItem = files.SingleOrDefault(item => item.FilePath.Contains("App.razor"));
88-
89-
if (appRazorItem != default)
90-
{
91-
var fixedAPPcontent = appRazorItem.Content.Replace("@typeof(", "@typeof(Test.").Replace("Program", "Counter"); //Todo change name "Counter" to dynamic type from Test Assemebly
92-
files.Remove(appRazorItem);
93-
files.Add((appRazorItem.FilePath, fixedAPPcontent));
94-
}
95+
// var appRazorItem = files.SingleOrDefault(item => item.FilePath.Contains("App.razor"));
96+
//
97+
// if (appRazorItem != default)
98+
// {
99+
// var fixedAPPcontent = appRazorItem.Content.Replace("@typeof(", "@typeof(Test.").Replace("Program", "Counter"); //Todo change name "Counter" to dynamic type from Test Assemebly
100+
// files.Remove(appRazorItem);
101+
// files.Add((appRazorItem.FilePath, fixedAPPcontent));
102+
// }
95103

96104
return files;
97105
}
@@ -209,7 +217,9 @@ public string Between(string STR, string FirstString, string LastString)
209217
}
210218
private string WrapHostTemplate(string html) //Todo make cached templete if its slow.
211219
{
212-
var hostFile = Directory.GetFiles(_fileSystemPath, "_Host.cshtml", SearchOption.AllDirectories).ToList().FirstOrDefault();
220+
var dir = Directory.GetParent(_fileSystemPath).Parent.FullName;
221+
222+
var hostFile = Directory.GetFiles(dir, "_Host.cshtml", SearchOption.AllDirectories).ToList().FirstOrDefault();
213223
var hostFileContent = File.ReadAllText(hostFile);
214224
var script = GetWebsocketScriptCode();
215225
//var app = Between(hostFile, "<App>", "</App>");
@@ -257,8 +267,10 @@ public IComponent Compile(IEnumerable<SyntaxTree> syntaxTrees, string asseblyNam
257267

258268
try
259269
{
260-
var type = asm.GetExportedTypes().SingleOrDefault(item => item.Name == "App"); //TODO make more posibilities returning not only APP component, because somtimes its harder to setup routes in runtime.
261-
var instance = (IComponent)Activator.CreateInstance(type);
270+
var appType = ExportedTypesBreadthFirstSearch(asm).Single(x => x.Name == "App");
271+
272+
var instance = (IComponent)Activator.CreateInstance(appType);
273+
262274
return instance;
263275
}
264276
catch (Exception)
@@ -268,5 +280,29 @@ public IComponent Compile(IEnumerable<SyntaxTree> syntaxTrees, string asseblyNam
268280

269281
}
270282
}
283+
284+
private IEnumerable<Type> ExportedTypesBreadthFirstSearch(Assembly entryAssembly)
285+
{
286+
var queue = new Queue<Assembly>();
287+
288+
queue.Enqueue(entryAssembly);
289+
var seen = new HashSet<string>();
290+
291+
while (queue.TryDequeue(out var a))
292+
{
293+
if(!seen.Add(a.GetName().Name))
294+
continue;
295+
296+
foreach (var type in a.ExportedTypes)
297+
yield return type;
298+
299+
foreach (var refName in a.GetReferencedAssemblies())
300+
{
301+
var refAssembly = Assembly.Load(refName);
302+
303+
queue.Enqueue(refAssembly);
304+
}
305+
}
306+
}
271307
}
272308
}

src/RazorComponentsPreview/RazorComponentsPreview.csproj

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk.Razor">
22

33
<PropertyGroup>
4-
<TargetFramework>netstandard2.1</TargetFramework>
4+
<TargetFramework>net5.0</TargetFramework>
55
<PackageLicenseExpression>MIT</PackageLicenseExpression>
66
<PackageTags>live,reload,blazor,preview,hot,module,replacement,razor</PackageTags>
77
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
@@ -11,12 +11,12 @@
1111
</PropertyGroup>
1212

1313
<ItemGroup>
14-
<PackageReference Include="Microsoft.AspNetCore.Razor.Language" Version="3.1.2" />
14+
<PackageReference Include="Microsoft.AspNetCore.Razor.Language" Version="5.0.0-rc.1.20451.17" />
1515
<PackageReference Include="Microsoft.AspNetCore.WebSockets" Version="2.2.1" />
16-
<PackageReference Include="Microsoft.CodeAnalysis.Razor" Version="3.1.2" />
17-
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.2" />
18-
<PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="3.1.2" />
19-
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.2" />
16+
<PackageReference Include="Microsoft.CodeAnalysis.Razor" Version="5.0.0-rc.1.20451.17" />
17+
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="5.0.0-rc.1.20451.*" />
18+
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="5.0.0-rc.1.20451.*" />
19+
<PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="5.0.0-rc.1.20451.17" />
2020
<PackageReference Include="System.Runtime.Loader" Version="4.3.0" />
2121
</ItemGroup>
2222

0 commit comments

Comments
 (0)