@@ -203,15 +203,15 @@ private void StoreField(FieldDefinition fd, ParameterDefinition valueParam, ILPr
203
203
MethodReference setter = module . ImportReference ( fd . FieldType . Resolve ( ) . GetMethod ( "set_Value" ) ) ;
204
204
205
205
worker . Append ( worker . Create ( OpCodes . Ldarg_0 ) ) ;
206
- worker . Append ( worker . Create ( OpCodes . Ldflda , fd ) ) ;
206
+ worker . Append ( worker . Create ( OpCodes . Ldflda , fd . MakeHostGenericIfNeeded ( ) ) ) ;
207
207
worker . Append ( worker . Create ( OpCodes . Ldarg , valueParam ) ) ;
208
208
worker . Append ( worker . Create ( OpCodes . Call , setter ) ) ;
209
209
}
210
210
else
211
211
{
212
212
worker . Append ( worker . Create ( OpCodes . Ldarg_0 ) ) ;
213
213
worker . Append ( worker . Create ( OpCodes . Ldarg , valueParam ) ) ;
214
- worker . Append ( worker . Create ( OpCodes . Stfld , fd ) ) ;
214
+ worker . Append ( worker . Create ( OpCodes . Stfld , fd . MakeHostGenericIfNeeded ( ) ) ) ;
215
215
}
216
216
}
217
217
@@ -221,7 +221,7 @@ private void LoadField(FieldDefinition fd, TypeReference originalType, ILProces
221
221
222
222
if ( IsWrapped ( fd . FieldType ) )
223
223
{
224
- worker . Append ( worker . Create ( OpCodes . Ldflda , fd ) ) ;
224
+ worker . Append ( worker . Create ( OpCodes . Ldflda , fd . MakeHostGenericIfNeeded ( ) ) ) ;
225
225
MethodReference getter = module . ImportReference ( fd . FieldType . Resolve ( ) . GetMethod ( "get_Value" ) ) ;
226
226
worker . Append ( worker . Create ( OpCodes . Call , getter ) ) ;
227
227
@@ -236,7 +236,7 @@ private void LoadField(FieldDefinition fd, TypeReference originalType, ILProces
236
236
}
237
237
else
238
238
{
239
- worker . Append ( worker . Create ( OpCodes . Ldfld , fd ) ) ;
239
+ worker . Append ( worker . Create ( OpCodes . Ldfld , fd . MakeHostGenericIfNeeded ( ) ) ) ;
240
240
}
241
241
}
242
242
@@ -422,7 +422,16 @@ void WriteEndFunctionCall()
422
422
{
423
423
// only use Callvirt when not static
424
424
OpCode opcode = hookMethod . IsStatic ? OpCodes . Call : OpCodes . Callvirt ;
425
- worker . Append ( worker . Create ( opcode , hookMethod ) ) ;
425
+ MethodReference hookMethodReference = hookMethod ;
426
+
427
+ if ( hookMethodReference . DeclaringType . HasGenericParameters )
428
+ {
429
+ // we need to get the Type<T>.HookMethod so convert it to a generic<T>.
430
+ var genericType = ( GenericInstanceType ) hookMethod . DeclaringType . ConvertToGenericIfNeeded ( ) ;
431
+ hookMethodReference = hookMethod . MakeHostInstanceGeneric ( genericType ) ;
432
+ }
433
+
434
+ worker . Append ( worker . Create ( opcode , module . ImportReference ( hookMethodReference ) ) ) ;
426
435
}
427
436
}
428
437
@@ -453,7 +462,7 @@ void GenerateSerialization(TypeDefinition netBehaviourSubclass)
453
462
// loc_0, this local variable is to determine if any variable was dirty
454
463
VariableDefinition dirtyLocal = serialize . AddLocal < bool > ( ) ;
455
464
456
- MethodDefinition baseSerialize = netBehaviourSubclass . BaseType . Resolve ( ) . GetMethodInBaseType ( SerializeMethodName ) ;
465
+ MethodReference baseSerialize = netBehaviourSubclass . BaseType . GetMethodInBaseType ( SerializeMethodName ) ;
457
466
if ( baseSerialize != null )
458
467
{
459
468
// base
@@ -538,7 +547,7 @@ private void WriteVariable(ILProcessor worker, ParameterDefinition writerParamet
538
547
worker . Append ( worker . Create ( OpCodes . Ldarg , writerParameter ) ) ;
539
548
// this
540
549
worker . Append ( worker . Create ( OpCodes . Ldarg_0 ) ) ;
541
- worker . Append ( worker . Create ( OpCodes . Ldfld , syncVar ) ) ;
550
+ worker . Append ( worker . Create ( OpCodes . Ldfld , syncVar . MakeHostGenericIfNeeded ( ) ) ) ;
542
551
MethodReference writeFunc = writers . GetWriteFunc ( syncVar . FieldType , null ) ;
543
552
if ( writeFunc != null )
544
553
{
@@ -574,7 +583,7 @@ void GenerateDeSerialization(TypeDefinition netBehaviourSubclass)
574
583
serialize . Body . InitLocals = true ;
575
584
VariableDefinition dirtyBitsLocal = serialize . AddLocal < long > ( ) ;
576
585
577
- MethodDefinition baseDeserialize = netBehaviourSubclass . BaseType . Resolve ( ) . GetMethodInBaseType ( DeserializeMethodName ) ;
586
+ MethodReference baseDeserialize = netBehaviourSubclass . BaseType . GetMethodInBaseType ( DeserializeMethodName ) ;
578
587
if ( baseDeserialize != null )
579
588
{
580
589
// base
@@ -681,7 +690,7 @@ void DeserializeField(FieldDefinition syncVar, ILProcessor serWorker, MethodDefi
681
690
// reader.Read()
682
691
serWorker . Append ( serWorker . Create ( OpCodes . Call , readFunc ) ) ;
683
692
// syncvar
684
- serWorker . Append ( serWorker . Create ( OpCodes . Stfld , syncVar ) ) ;
693
+ serWorker . Append ( serWorker . Create ( OpCodes . Stfld , syncVar . MakeHostGenericIfNeeded ( ) ) ) ;
685
694
686
695
if ( hookMethod != null )
687
696
{
0 commit comments