Skip to content

Commit b924a6f

Browse files
committed
Use alternative strategy to provide a (message, typeName) overload in Mono, while still avoiding changes to the Mono runtime code.
1 parent 0325ce1 commit b924a6f

File tree

5 files changed

+38
-23
lines changed

5 files changed

+38
-23
lines changed

src/coreclr/System.Private.CoreLib/src/System/Reflection/TypeNameResolver.CoreCLR.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -213,8 +213,8 @@ internal static RuntimeType GetTypeReferencedByCustomAttribute(string typeName,
213213
{
214214
throw new TypeLoadException(assembly is null ?
215215
SR.Format(SR.TypeLoad_ResolveType, escapedTypeName) :
216-
SR.Format(SR.TypeLoad_ResolveTypeFromAssembly, escapedTypeName, assembly.FullName))
217-
{ TypeName = escapedTypeName };
216+
SR.Format(SR.TypeLoad_ResolveTypeFromAssembly, escapedTypeName, assembly.FullName),
217+
typeName: escapedTypeName);
218218
}
219219
return null;
220220
}
@@ -246,8 +246,8 @@ internal static RuntimeType GetTypeReferencedByCustomAttribute(string typeName,
246246
{
247247
if (_throwOnError)
248248
{
249-
throw new TypeLoadException(SR.Format(SR.TypeLoad_ResolveTypeFromAssembly, parsedName.FullName, runtimeAssembly.FullName))
250-
{ TypeName = parsedName.FullName };
249+
throw new TypeLoadException(SR.Format(SR.TypeLoad_ResolveTypeFromAssembly, parsedName.FullName, runtimeAssembly.FullName),
250+
typeName: parsedName.FullName);
251251
}
252252
return null;
253253
}
@@ -282,8 +282,8 @@ internal static RuntimeType GetTypeReferencedByCustomAttribute(string typeName,
282282
if (_throwOnError)
283283
{
284284
throw new TypeLoadException(SR.Format(SR.TypeLoad_ResolveNestedType,
285-
nestedTypeNames[i], (i > 0) ? nestedTypeNames[i - 1] : TypeName.Unescape(escapedTypeName)))
286-
{ TypeName = parsedName.FullName };
285+
nestedTypeNames[i], (i > 0) ? nestedTypeNames[i - 1] : TypeName.Unescape(escapedTypeName)),
286+
typeName: parsedName.FullName);
287287
}
288288
return null;
289289
}
@@ -320,8 +320,8 @@ internal static RuntimeType GetTypeReferencedByCustomAttribute(string typeName,
320320

321321
if (_throwOnError)
322322
{
323-
throw new TypeLoadException(SR.Format(SR.TypeLoad_ResolveTypeFromAssembly, parsedName.FullName, (requestingAssembly ?? coreLib).FullName))
324-
{ TypeName = parsedName.FullName };
323+
throw new TypeLoadException(SR.Format(SR.TypeLoad_ResolveTypeFromAssembly, parsedName.FullName, (requestingAssembly ?? coreLib).FullName),
324+
typeName: parsedName.FullName);
325325
}
326326

327327
return null;

src/coreclr/nativeaot/System.Private.CoreLib/src/System/Reflection/TypeNameResolver.NativeAot.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,8 @@ internal partial struct TypeNameResolver
146146
{
147147
throw new TypeLoadException(assembly is null ?
148148
SR.Format(SR.TypeLoad_ResolveType, escapedTypeName) :
149-
SR.Format(SR.TypeLoad_ResolveTypeFromAssembly, escapedTypeName, assembly.FullName))
150-
{ TypeNameResolver = escapedTypeName };
149+
SR.Format(SR.TypeLoad_ResolveTypeFromAssembly, escapedTypeName, assembly.FullName),
150+
typeName: escapedTypeName);
151151
}
152152
return null;
153153
}
@@ -235,8 +235,8 @@ internal partial struct TypeNameResolver
235235
if (_throwOnError)
236236
{
237237
throw new TypeLoadException(SR.Format(SR.TypeLoad_ResolveNestedType,
238-
nestedTypeNames[i], (i > 0) ? nestedTypeNames[i - 1] : TypeName.Unescape(escapedTypeName)));
239-
{ TypeName = parsedName.FullName };
238+
nestedTypeNames[i], (i > 0) ? nestedTypeNames[i - 1] : TypeName.Unescape(escapedTypeName)),
239+
typeName: parsedName.FullName);
240240
}
241241
return null;
242242
}

src/libraries/System.Private.CoreLib/src/System/TypeLoadException.cs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,15 @@ public TypeLoadException(string? message, Exception? inner)
2929
HResult = HResults.COR_E_TYPELOAD;
3030
}
3131

32+
#if !MONO
33+
internal TypeLoadException(string message, string typeName)
34+
: base(message)
35+
{
36+
HResult = HResults.COR_E_TYPELOAD;
37+
_className = typeName;
38+
}
39+
#endif
40+
3241
public override string Message
3342
{
3443
get
@@ -38,13 +47,7 @@ public override string Message
3847
}
3948
}
4049

41-
public string TypeName
42-
{
43-
get => _className ?? string.Empty;
44-
// This is an init-only property, because a (string message, string typeName) constructor
45-
// would conflict with Mono's (string typeName, string assemblyName) constructor.
46-
internal init => _className = value;
47-
}
50+
public string TypeName => _className ?? string.Empty;
4851

4952
[Obsolete(Obsoletions.LegacyFormatterImplMessage, DiagnosticId = Obsoletions.LegacyFormatterImplDiagId, UrlFormat = Obsoletions.SharedUrlFormat)]
5053
[EditorBrowsable(EditorBrowsableState.Never)]

src/mono/System.Private.CoreLib/src/System/Reflection/TypeNameResolver.Mono.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,8 @@ internal unsafe ref partial struct TypeNameResolver
115115
{
116116
throw new TypeLoadException(assembly is null ?
117117
SR.Format(SR.TypeLoad_ResolveType, escapedTypeName) :
118-
SR.Format(SR.TypeLoad_ResolveTypeFromAssembly, escapedTypeName, assembly.FullName))
119-
{ TypeName = escapedTypeName };
118+
SR.Format(SR.TypeLoad_ResolveTypeFromAssembly, escapedTypeName, assembly.FullName),
119+
typeName: escapedTypeName);
120120
}
121121
return null;
122122
}
@@ -160,8 +160,8 @@ internal unsafe ref partial struct TypeNameResolver
160160
if (_throwOnError)
161161
{
162162
throw new TypeLoadException(SR.Format(SR.TypeLoad_ResolveNestedType,
163-
nestedTypeNames[i], (i > 0) ? nestedTypeNames[i - 1] : TypeName.Unescape(escapedTypeName)))
164-
{ TypeName = parsedName.FullName };
163+
nestedTypeNames[i], (i > 0) ? nestedTypeNames[i - 1] : TypeName.Unescape(escapedTypeName)),
164+
typeName: escapedTypeName);
165165
}
166166
return null;
167167
}

src/mono/System.Private.CoreLib/src/System/TypeLoadException.Mono.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,18 @@ internal TypeLoadException(string className, string assemblyName)
1313
_assemblyName = assemblyName;
1414
}
1515

16+
// Because the Mono runtime has a dependency to a (string, string) constructor overload,
17+
// we add a dummy parameter with a default value to minimize native code changes.
18+
// In order to use this overload, callers should either pass three arguments, or specify
19+
// one of the parameters by name.
20+
internal TypeLoadException(string message, string typeName, bool useMessageTypeNameOverload = true)
21+
: base(message)
22+
{
23+
_ = useMessageTypeNameOverload;
24+
HResult = HResults.COR_E_TYPELOAD;
25+
_className = typeName;
26+
}
27+
1628
private void SetMessageField()
1729
{
1830
if (_message != null)

0 commit comments

Comments
 (0)