@@ -29,6 +29,11 @@ internal static ParameterInfo GetReturnParameter(IRuntimeMethodInfo method, Memb
29
29
private static ParameterInfo [ ] GetParameters (
30
30
IRuntimeMethodInfo methodHandle , MemberInfo member , Signature sig , out ParameterInfo ? returnParameter , bool fetchReturnParameter )
31
31
{
32
+ // The lifetime rules for MetadataImport expect these two objects to be the same instance.
33
+ // See the lifetime of MetadataImport, acquired through IRuntimeMethodInfo, but extended
34
+ // through the MemberInfo instance.
35
+ Debug . Assert ( ReferenceEquals ( methodHandle , member ) ) ;
36
+
32
37
returnParameter = null ;
33
38
int sigArgCount = sig . Arguments . Length ;
34
39
ParameterInfo [ ] args =
@@ -43,7 +48,7 @@ private static ParameterInfo[] GetParameters(
43
48
// are generated on the fly by the runtime.
44
49
if ( ! MdToken . IsNullToken ( tkMethodDef ) )
45
50
{
46
- MetadataImport scope = RuntimeTypeHandle . GetMetadataImport ( RuntimeMethodHandle . GetDeclaringType ( methodHandle ) ) ;
51
+ MetadataImport scope = RuntimeMethodHandle . GetDeclaringType ( methodHandle ) . GetRuntimeModule ( ) . MetadataImport ;
47
52
48
53
scope . EnumParams ( tkMethodDef , out MetadataEnumResult tkParamDefs ) ;
49
54
@@ -73,7 +78,7 @@ private static ParameterInfo[] GetParameters(
73
78
}
74
79
else if ( ! fetchReturnParameter && position >= 0 )
75
80
{
76
- // position beyong sigArgCount?
81
+ // position beyond sigArgCount?
77
82
if ( position >= sigArgCount )
78
83
throw new BadImageFormatException ( SR . BadImageFormat_ParameterSignatureMismatch ) ;
79
84
@@ -86,7 +91,7 @@ private static ParameterInfo[] GetParameters(
86
91
// Fill in empty ParameterInfos for those without tokens
87
92
if ( fetchReturnParameter )
88
93
{
89
- returnParameter ??= new RuntimeParameterInfo ( sig , MetadataImport . EmptyImport , 0 , - 1 , ( ParameterAttributes ) 0 , member ) ;
94
+ returnParameter ??= new RuntimeParameterInfo ( sig , default , 0 , - 1 , ( ParameterAttributes ) 0 , member ) ;
90
95
}
91
96
else
92
97
{
@@ -97,7 +102,7 @@ private static ParameterInfo[] GetParameters(
97
102
if ( args [ i ] != null )
98
103
continue ;
99
104
100
- args [ i ] = new RuntimeParameterInfo ( sig , MetadataImport . EmptyImport , 0 , i , ( ParameterAttributes ) 0 , member ) ;
105
+ args [ i ] = new RuntimeParameterInfo ( sig , default , 0 , i , ( ParameterAttributes ) 0 , member ) ;
101
106
}
102
107
}
103
108
}
@@ -165,7 +170,7 @@ private RuntimeParameterInfo(RuntimeParameterInfo accessor, MemberInfo member)
165
170
PositionImpl = accessor . Position ;
166
171
AttrsImpl = accessor . Attributes ;
167
172
168
- // Strictly speeking, property's don't contain parameter tokens
173
+ // Strictly speaking, properties don't contain parameter tokens
169
174
// However we need this to make ca's work... oh well...
170
175
m_tkParamDef = MdToken . IsNullToken ( accessor . MetadataToken ) ? ( int ) MetadataTokenType . ParamDef : accessor . MetadataToken ;
171
176
m_scope = accessor . m_scope ;
@@ -176,7 +181,7 @@ private RuntimeParameterInfo(
176
181
int position , ParameterAttributes attributes , MemberInfo member )
177
182
{
178
183
Debug . Assert ( member != null ) ;
179
- Debug . Assert ( MdToken . IsNullToken ( tkParamDef ) == scope . Equals ( MetadataImport . EmptyImport ) ) ;
184
+ Debug . Assert ( MdToken . IsNullToken ( tkParamDef ) == scope . Equals ( ( MetadataImport ) default ) ) ;
180
185
Debug . Assert ( MdToken . IsNullToken ( tkParamDef ) || MdToken . IsTokenOfType ( tkParamDef , MetadataTokenType . ParamDef ) ) ;
181
186
182
187
PositionImpl = position ;
@@ -201,7 +206,7 @@ internal RuntimeParameterInfo(MethodInfo owner, string? name, Type parameterType
201
206
PositionImpl = position ;
202
207
AttrsImpl = ParameterAttributes . None ;
203
208
m_tkParamDef = ( int ) MetadataTokenType . ParamDef ;
204
- m_scope = MetadataImport . EmptyImport ;
209
+ m_scope = default ;
205
210
}
206
211
#endregion
207
212
@@ -239,6 +244,7 @@ public override string? Name
239
244
if ( ! MdToken . IsNullToken ( m_tkParamDef ) )
240
245
{
241
246
string name = m_scope . GetName ( m_tkParamDef ) . ToString ( ) ;
247
+ GC . KeepAlive ( this ) ;
242
248
NameImpl = name ;
243
249
}
244
250
@@ -339,6 +345,7 @@ private bool TryGetDefaultValueInternal(bool raw, out object? defaultValue)
339
345
#region Look for a default value in metadata
340
346
// This will return DBNull.Value if no constant value is defined on m_tkParamDef in the metadata.
341
347
defaultValue = MdConstant . GetValue ( m_scope , m_tkParamDef , ParameterType . TypeHandle , raw ) ;
348
+ GC . KeepAlive ( this ) ;
342
349
343
350
// If default value is not specified in metadata, look for it in custom attributes
344
351
if ( defaultValue == DBNull . Value )
0 commit comments