@@ -22,6 +22,62 @@ public abstract class CodeDomProvider : IDisposable
22
22
23
23
public event EventHandler < CompilationEventArgs > BeforeEmitCompilation ;
24
24
25
+ #if NETCOREAPP
26
+ /// <summary>
27
+ /// If these assemblies were not found when 'trimmed', then skip them
28
+ /// </summary>
29
+ protected static readonly string [ ] SkippedAssemblies = new string [ ] {
30
+ "System.dll" ,
31
+
32
+ "System.Drawing.dll" ,
33
+
34
+ //"System.Drawing.Primitives",
35
+
36
+ "System.Data.dll" ,
37
+
38
+ "System.Xml.dll" ,
39
+ } ;
40
+ #endif
41
+
42
+ protected void AddReferences ( CompilerParameters cp , List < MetadataReference > references )
43
+ {
44
+ foreach ( string reference in cp . ReferencedAssemblies )
45
+ {
46
+ #if DEBUG
47
+ Console . WriteLine ( $ "TRY ADD { reference } .") ;
48
+ #endif
49
+ #if NETCOREAPP
50
+ try
51
+ {
52
+ #endif
53
+ references . Add ( GetReference ( reference ) ) ;
54
+ #if NETCOREAPP
55
+ }
56
+ catch ( FileNotFoundException e )
57
+ {
58
+ if ( SkippedAssemblies . Contains ( reference ) )
59
+ {
60
+ #if DEBUG
61
+ Console . WriteLine ( $ "{ reference } FileNotFound. SKIPPED") ;
62
+ #endif
63
+ continue ;
64
+ }
65
+ else
66
+ throw e ;
67
+ }
68
+ #endif
69
+
70
+ #if DEBUG
71
+ Console . WriteLine ( $ "{ reference } ADDED") ;
72
+ #endif
73
+ }
74
+ #if DEBUG
75
+ Console . WriteLine ( "AFTER ADDING ReferencedAssemblies" ) ;
76
+ #endif
77
+
78
+ AddExtraAssemblies ( cp . ReferencedAssemblies , references ) ;
79
+ }
80
+
25
81
26
82
protected void AddExtraAssemblies ( StringCollection referencedAssemblies , List < MetadataReference > references )
27
83
{
@@ -52,7 +108,25 @@ protected void AddExtraAssemblies(StringCollection referencedAssemblies, List<Me
52
108
foreach ( string assembly in assemblies )
53
109
{
54
110
if ( ! referencedAssemblies . Contains ( assembly ) )
55
- references . Add ( GetReference ( assembly ) ) ;
111
+ {
112
+ #if NETCOREAPP
113
+ try
114
+ {
115
+ #endif
116
+ references . Add ( GetReference ( assembly ) ) ;
117
+ #if NETCOREAPP
118
+ }
119
+ // If user run 'dotnet publish' with Trimmed - dotnet cut some extra assemblies.
120
+ // We skip this error, because some assemblies in 'assemblies' array may not be needed
121
+ catch ( FileNotFoundException )
122
+ {
123
+ #if DEBUG
124
+ Console . WriteLine ( $ "{ assembly } FILENOTFOUND. SKIPPED") ;
125
+ #endif
126
+ continue ;
127
+ }
128
+ #endif
129
+ }
56
130
}
57
131
}
58
132
@@ -76,7 +150,7 @@ public MetadataReference GetReference(string refDll)
76
150
return cache [ refDll ] ;
77
151
78
152
reference = refDll . EndsWith ( ".dll" ) || refDll . EndsWith ( ".exe" ) ?
79
- refDll . Substring ( 0 , refDll . Length - 4 ) : refDll ;
153
+ refDll . Substring ( 0 , refDll . Length - 4 ) : refDll ;
80
154
if ( ! refDll . Contains ( Path . DirectorySeparatorChar ) )
81
155
{
82
156
#if NETCOREAPP
@@ -87,6 +161,9 @@ public MetadataReference GetReference(string refDll)
87
161
{
88
162
if ( loadedAssembly . GetName ( ) . Name == reference )
89
163
{
164
+ #if DEBUG
165
+ Console . WriteLine ( "FIND IN AssemblyLoadContext" ) ;
166
+ #endif
90
167
string location = loadedAssembly . Location ;
91
168
if ( string . IsNullOrEmpty ( location ) )
92
169
{
@@ -107,6 +184,9 @@ public MetadataReference GetReference(string refDll)
107
184
{
108
185
if ( string . Compare ( currAssembly . GetName ( ) . Name , reference , true ) == 0 )
109
186
{
187
+ #if DEBUG
188
+ Console . WriteLine ( "FIND IN AppDomain" ) ;
189
+ #endif
110
190
// Found it, return the location as the full reference.
111
191
result = MetadataReference . CreateFromFile ( currAssembly . Location ) ;
112
192
cache [ refDll ] = result ;
@@ -119,6 +199,9 @@ public MetadataReference GetReference(string refDll)
119
199
{
120
200
if ( name . Name == reference )
121
201
{
202
+ #if DEBUG
203
+ Console . WriteLine ( "FIND IN ReferencedAssemblies" ) ;
204
+ #endif
122
205
#if NETCOREAPP
123
206
// try load Assembly in runtime (for user script with custom assembly)
124
207
var assembly = AssemblyLoadContext . Default . LoadFromAssemblyName ( name ) ;
@@ -170,16 +253,29 @@ public MetadataReference GetReference(string refDll)
170
253
catch
171
254
{
172
255
var assemblyName = new AssemblyName ( reference ) ;
256
+ #if DEBUG
257
+ Console . WriteLine ( "IN AssemblyName" ) ;
258
+ #endif
259
+
173
260
#if NETCOREAPP
174
261
// try load Assembly in runtime (for user script with custom assembly)
175
262
var assembly = AssemblyLoadContext . Default . LoadFromAssemblyName ( assemblyName ) ;
176
263
#else
177
264
var assembly = Assembly . Load ( assemblyName ) ;
178
265
#endif
179
-
180
266
string location = assembly . Location ;
267
+ #if DEBUG
268
+ Console . WriteLine ( $ "Location after LoadFromAssemblyName: { location } ") ;
269
+ #endif
181
270
182
- result = MetadataReference . CreateFromFile ( location ) ;
271
+ #if NETCOREAPP
272
+ if ( string . IsNullOrEmpty ( location ) )
273
+ {
274
+ result = GetMetadataReferenceInSingleFileApp ( assembly ) ;
275
+ }
276
+ else
277
+ #endif
278
+ result = MetadataReference . CreateFromFile ( location ) ;
183
279
cache [ refDll ] = result ;
184
280
return result ;
185
281
}
@@ -188,6 +284,9 @@ public MetadataReference GetReference(string refDll)
188
284
#if NETCOREAPP
189
285
private static unsafe MetadataReference GetMetadataReferenceInSingleFileApp ( Assembly assembly )
190
286
{
287
+ #if DEBUG
288
+ Console . WriteLine ( $ "TRY IN UNSAFE METHOD { assembly . GetName ( ) . Name } ") ;
289
+ #endif
191
290
assembly . TryGetRawMetadata ( out byte * blob , out int length ) ;
192
291
var moduleMetadata = ModuleMetadata . CreateFromMetadata ( ( IntPtr ) blob , length ) ;
193
292
var assemblyMetadata = AssemblyMetadata . Create ( moduleMetadata ) ;
0 commit comments