15
15
using System . Reflection . PortableExecutable ;
16
16
using System . Runtime . Intrinsics ;
17
17
using Microsoft . CodeAnalysis . Operations ;
18
+ using Microsoft . Extensions . DependencyModel ;
18
19
19
20
[ assembly: Debuggable ( DebuggableAttribute . DebuggingModes . EnableEditAndContinue ) ]
20
21
namespace HotReloadSample
@@ -23,16 +24,41 @@ internal class Program
23
24
{
24
25
static unsafe void Main ( string [ ] args )
25
26
{
27
+ NatashaManagement . RegistDomainCreator < NatashaDomainCreator > ( ) ;
28
+
29
+ // AssemblyCSharpBuilder builder = new();
30
+ // builder.UseRandomDomain();
31
+ // builder.UseSimpleMode();
32
+ // builder.WithoutCombineUsingCode();
33
+ // builder.ConfigCompilerOption(opt => opt
34
+ // .AddSupperess("CS8618")
35
+ //// .WithDiagnosticLevel(ReportDiagnostic.Info)
36
+ // );
37
+ // builder.ConfigLoadContext(opt =>
38
+ // opt
39
+ // .AddReferenceAndUsingCode<object>()
40
+ // .AddReferenceAndUsingCode<Task>()
41
+ // );
42
+ // builder.Add("using System.Threading.Tasks; public class A{ public string Name; public async Task Delay() {return;} }");
43
+ // builder.SetLogEvent((log) =>
44
+ // {
45
+ // Console.WriteLine(log.ToString());
46
+ // });
47
+ // var asm = builder.GetAssembly();
48
+ // Console.WriteLine(asm.FullName);
49
+
50
+
51
+
26
52
Console . WriteLine ( MetadataUpdater . IsSupported ) ;
53
+ Console . WriteLine ( Debugger . IsAttached ) ;
27
54
//Console.WriteLine(Vector128<short>.Count);
28
55
//var asm = typeof(A).Assembly;
29
56
//Stopwatch stopwatch = Stopwatch.StartNew();
30
57
//HashSet<string> names = new HashSet<string>();
31
58
//HashSet<string> names1 = new HashSet<string>();
32
59
//foreach (var item in asm.ExportedTypes)
33
60
//{
34
- // if (item.Namespace!=null)
35
- // {
61
+ // if (item.Namespace!=null) // {
36
62
// names.Add(item.Namespace);
37
63
// }
38
64
//}
@@ -61,77 +87,73 @@ static unsafe void Main(string[] args)
61
87
//Test(typeof(A).Assembly);
62
88
//HotReloadService.UpdateApplicationEvent += HotReloadService_UpdateApplicationEvent;
63
89
//NatashaManagement.Preheating(null,false,true);
64
- //var domain = NatashaManagement.CreateRandomDomain();
65
- ////var asm1 = OldAssembly(domain);
66
- ////Show(asm1);
67
- //var asm2 = NewAssembly(domain);
68
- //Show(asm2);
69
- //Update(typeof(A).Assembly, asm2);
70
- //Show(typeof(A).Assembly);
71
- ////MetadataUpdater.ApplyUpdate();
72
- Console . ReadKey ( ) ;
73
-
74
- }
75
-
76
- public unsafe static void Test ( Assembly assembly )
77
- {
78
- if ( assembly . TryGetRawMetadata ( out var blob , out var length ) )
90
+ var domain = NatashaManagement . CreateRandomDomain ( ) ;
91
+ var asm1 = OldAssembly ( domain ) ;
92
+ var typeA = asm1 . GetTypeFromShortName ( "A" ) ;
93
+ var methodInfo = typeA . GetMethod ( "Show" ) ;
94
+ var obj = Activator . CreateInstance ( typeA ) ;
95
+ methodInfo . Invoke ( obj , null ) ;
96
+ Console . WriteLine ( ) ;
97
+ Assembly asm2 = asm1 ;
98
+ try
79
99
{
80
- //HXD04
81
- //var metadataReference = AssemblyMetadata.Create(ModuleMetadata.CreateFromMetadata((IntPtr)blob, length)).GetReference();
82
- var metaReader = new MetadataReader ( blob , length ) ;
83
- foreach ( var item in metaReader . MethodDefinitions )
84
- {
85
- var methodDefine = metaReader . GetMethodDefinition ( item ) ;
86
- var methodName = metaReader . GetString ( methodDefine . Name ) ;
87
- if ( methodName == "Show2" )
88
- {
89
- Console . WriteLine ( metaReader . GetString ( metaReader . GetTypeDefinition ( methodDefine . GetDeclaringType ( ) ) . Name ) ) ;
90
- Console . WriteLine ( Encoding . UTF8 . GetString ( metaReader . GetBlobBytes ( methodDefine . Signature ) ) ) ;
91
- foreach ( var parameter in methodDefine . GetParameters ( ) )
92
- {
93
- var para = metaReader . GetParameter ( parameter ) ;
94
- foreach ( var paraAttr in para . GetCustomAttributes ( ) )
95
- {
96
- Console . WriteLine ( Encoding . UTF8 . GetString ( metaReader . GetBlobBytes ( metaReader . GetCustomAttribute ( paraAttr ) . Value ) ) ) ;
97
- }
98
- Console . WriteLine ( metaReader . GetString ( para . Name ) ) ;
99
- }
100
- Console . WriteLine ( ) ;
101
- }
102
-
103
- }
104
-
105
-
106
- var asmDefinition = metaReader . GetNamespaceDefinitionRoot ( ) ;
107
- foreach ( var handle in asmDefinition . NamespaceDefinitions )
108
- {
109
- var nameDefinition = metaReader . GetNamespaceDefinition ( handle ) ;
110
- Console . WriteLine ( $ "{ nameDefinition . Name . IsNil } : { metaReader . GetString ( handle ) } : { nameDefinition . TypeDefinitions . Length } ") ;
111
- }
100
+ asm2 = NewAssembly ( domain , asm1 ) ;
112
101
}
113
- }
114
- private static void HotReloadService_UpdateApplicationEvent ( Type [ ] ? obj )
115
- {
116
- Console . WriteLine ( obj == null ) ;
102
+ catch ( Exception ex )
103
+ {
104
+ var ex1 = ex as InvalidOperationException ;
105
+ Console . WriteLine ( ex1 . Message ) ;
106
+ Console . WriteLine ( ex . Message ) ;
107
+ Console . WriteLine ( ex . StackTrace ) ;
108
+ return ;
109
+ }
110
+
111
+ var members = asm2 . GetTypeFromShortName ( "A" ) . GetMembers ( ) ;
112
+ var typeA1 = asm2 . GetTypeFromShortName ( "A" ) ;
113
+ methodInfo = typeA1 . GetMethod ( "Show" ) ;
114
+ var obj1 = Activator . CreateInstance ( typeA1 ) ;
115
+ methodInfo . Invoke ( obj1 , null ) ;
116
+ Console . ReadKey ( ) ;
117
117
}
118
118
119
+ //private static void HotReloadService_UpdateApplicationEvent(Type[]? obj)
120
+ //{
121
+ // Console.WriteLine(obj==null);
122
+ //}
123
+
119
124
public static Assembly OldAssembly ( NatashaLoadContext domain )
120
125
{
121
- AssemblyCSharpBuilder builder = new AssemblyCSharpBuilder
126
+ AssemblyCSharpBuilder builder = new ( )
122
127
{
123
128
LoadContext = domain
124
129
} ;
125
- builder . Add ( "public class A{ public int Code = 1; public void Show(){ Console.WriteLine(Code); } }" , UsingLoadBehavior . WithDefault ) ;
130
+ builder . UseSimpleMode ( ) ;
131
+ builder . ConfigLoadContext ( opt => opt
132
+ . AddReferenceAndUsingCode ( typeof ( object ) )
133
+ . AddReferenceAndUsingCode ( typeof ( Console ) )
134
+ ) ;
135
+ builder . WithDebugCompile ( opt => opt . WriteToAssembly ( ) ) ;
136
+ builder . Add ( "public class A{ public int Code = 1; public void Show(){ Console.WriteLine(Code); } }" ) ;
126
137
return builder . GetAssembly ( ) ;
127
138
}
128
-
129
- public static Assembly NewAssembly ( NatashaLoadContext domain )
139
+ //CTRL+F5
140
+ public static Assembly NewAssembly ( NatashaLoadContext domain , Assembly oldAssembly )
130
141
{
131
- AssemblyCSharpBuilder builder = new AssemblyCSharpBuilder ( ) ;
142
+ AssemblyCSharpBuilder builder = new AssemblyCSharpBuilder ( oldAssembly . GetName ( ) . Name ) ;
132
143
builder . LoadContext = domain ;
133
- builder . Add ( "public class A{ public int Code = 2; public void Show(){ Console.WriteLine(Code); } }" , UsingLoadBehavior . WithDefault ) ;
134
- return builder . GetAssembly ( ) ;
144
+ builder . WithFileOutput ( ) ;
145
+ builder . UseSimpleMode ( ) ;
146
+ builder . ConfigLoadContext ( opt => opt
147
+ . AddReferenceAndUsingCode ( typeof ( object ) )
148
+ . AddReferenceAndUsingCode ( typeof ( Console ) )
149
+ ) ;
150
+ //builder.WithDebugCompile(opt => opt.WriteToAssembly());
151
+ builder . Add ( "public class A{ public int Code = 2; public int Code1 = 0; public void Show(){ Console.WriteLine(Code); } }" ) ;
152
+ var result = builder . UpdateAssembly ( oldAssembly ) ;
153
+ //Console.WriteLine(1);
154
+ //MetadataUpdater.ApplyUpdate(result.Item1, result.Item2, result.Item3, result.Item4);
155
+ //return result.Item1;
156
+ return result . Item1 ;
135
157
}
136
158
137
159
public static void Show ( Assembly assembly )
@@ -140,14 +162,13 @@ public static void Show(Assembly assembly)
140
162
var method = type ! . GetMethod ( "Show" ) ;
141
163
method ! . Invoke ( Activator . CreateInstance ( type ) , null ) ;
142
164
}
143
-
144
165
public unsafe static void Update ( Assembly oldAssembly , Assembly newAssembly )
145
166
{
146
167
Console . WriteLine ( RuntimeFeature . IsDynamicCodeCompiled ) ;
147
168
Console . WriteLine ( MetadataUpdater . IsSupported ) ;
148
169
if ( newAssembly . TryGetRawMetadata ( out var newBlob , out var newLength ) )
149
170
{
150
- ReadOnlySpan < byte > newMetadataSpan = new ReadOnlySpan < byte > ( newBlob , newLength ) ;
171
+ ReadOnlySpan < byte > newMetadataSpan = new ( newBlob , newLength ) ;
151
172
MetadataUpdater . ApplyUpdate ( oldAssembly , newMetadataSpan , Encoding . UTF8 . GetBytes ( File . ReadAllText ( "1.txt" ) ) , ReadOnlySpan < byte > . Empty ) ;
152
173
}
153
174
0 commit comments