@@ -1053,8 +1053,10 @@ public void Emit (Dictionary<Attribute, List<Attribute>> allEmitted)
1053
1053
}
1054
1054
1055
1055
byte [ ] cdata ;
1056
+ List < Assembly > references ;
1056
1057
if ( pos_args == null && named_values == null ) {
1057
1058
cdata = AttributeEncoder . Empty ;
1059
+ references = null ;
1058
1060
} else {
1059
1061
AttributeEncoder encoder = new AttributeEncoder ( ) ;
1060
1062
@@ -1127,7 +1129,7 @@ public void Emit (Dictionary<Attribute, List<Attribute>> allEmitted)
1127
1129
encoder . EncodeEmptyNamedArguments ( ) ;
1128
1130
}
1129
1131
1130
- cdata = encoder . ToArray ( ) ;
1132
+ cdata = encoder . ToArray ( out references ) ;
1131
1133
}
1132
1134
1133
1135
if ( ! IsConditionallyExcluded ( ctor . DeclaringType ) ) {
@@ -1146,6 +1148,8 @@ public void Emit (Dictionary<Attribute, List<Attribute>> allEmitted)
1146
1148
Error_AttributeEmitError ( e . Message ) ;
1147
1149
return ;
1148
1150
}
1151
+
1152
+ context . Module . AddAssemblyReferences ( references ) ;
1149
1153
}
1150
1154
1151
1155
if ( ! usage_attr . AllowMultiple && allEmitted != null ) {
@@ -1404,6 +1408,7 @@ public enum EncodedTypeProperties
1404
1408
byte [ ] buffer ;
1405
1409
int pos ;
1406
1410
const ushort Version = 1 ;
1411
+ List < Assembly > imports ;
1407
1412
1408
1413
static AttributeEncoder ( )
1409
1414
{
@@ -1583,7 +1588,15 @@ public EncodedTypeProperties Encode (TypeSpec type)
1583
1588
public void EncodeTypeName ( TypeSpec type )
1584
1589
{
1585
1590
var old_type = type . GetMetaInfo ( ) ;
1586
- Encode ( type . MemberDefinition . IsImported ? old_type . AssemblyQualifiedName : old_type . FullName ) ;
1591
+ if ( type . MemberDefinition . IsImported ) {
1592
+ if ( imports == null )
1593
+ imports = new List < Assembly > ( ) ;
1594
+
1595
+ imports . Add ( old_type . Assembly ) ;
1596
+ Encode ( old_type . AssemblyQualifiedName ) ;
1597
+ } else {
1598
+ Encode ( old_type . FullName ) ;
1599
+ }
1587
1600
}
1588
1601
1589
1602
public void EncodeTypeName ( TypeContainer type )
@@ -1664,8 +1677,10 @@ void WriteCompressedValue (int value)
1664
1677
Encode ( value ) ;
1665
1678
}
1666
1679
1667
- public byte [ ] ToArray ( )
1680
+ public byte [ ] ToArray ( out List < Assembly > assemblyReferences )
1668
1681
{
1682
+ assemblyReferences = imports ;
1683
+
1669
1684
byte [ ] buf = new byte [ pos ] ;
1670
1685
Array . Copy ( buffer , buf , pos ) ;
1671
1686
return buf ;
@@ -1977,7 +1992,8 @@ public void EmitAttribute (FieldBuilder builder, System.Diagnostics.DebuggerBrow
1977
1992
encoder . Encode ( ( int ) state ) ;
1978
1993
encoder . EncodeEmptyNamedArguments ( ) ;
1979
1994
1980
- builder . SetCustomAttribute ( ( ConstructorInfo ) ctor . GetMetaInfo ( ) , encoder . ToArray ( ) ) ;
1995
+ builder . SetCustomAttribute ( ( ConstructorInfo ) ctor . GetMetaInfo ( ) , encoder . ToArray ( out var references ) ) ;
1996
+ module . AddAssemblyReferences ( references ) ;
1981
1997
}
1982
1998
}
1983
1999
@@ -2011,7 +2027,8 @@ public void EmitAttribute (AssemblyBuilder builder, System.Diagnostics.Debuggabl
2011
2027
encoder . Encode ( ( int ) modes ) ;
2012
2028
encoder . EncodeEmptyNamedArguments ( ) ;
2013
2029
2014
- builder . SetCustomAttribute ( ( ConstructorInfo ) ctor . GetMetaInfo ( ) , encoder . ToArray ( ) ) ;
2030
+ builder . SetCustomAttribute ( ( ConstructorInfo ) ctor . GetMetaInfo ( ) , encoder . ToArray ( out var references ) ) ;
2031
+ module . AddAssemblyReferences ( references ) ;
2015
2032
}
2016
2033
}
2017
2034
@@ -2037,7 +2054,8 @@ public void EmitAttribute (ParameterBuilder builder, decimal value, Location loc
2037
2054
encoder . Encode ( ( uint ) bits [ 0 ] ) ;
2038
2055
encoder . EncodeEmptyNamedArguments ( ) ;
2039
2056
2040
- builder . SetCustomAttribute ( ( ConstructorInfo ) ctor . GetMetaInfo ( ) , encoder . ToArray ( ) ) ;
2057
+ builder . SetCustomAttribute ( ( ConstructorInfo ) ctor . GetMetaInfo ( ) , encoder . ToArray ( out var references ) ) ;
2058
+ module . AddAssemblyReferences ( references ) ;
2041
2059
}
2042
2060
2043
2061
public void EmitAttribute ( FieldBuilder builder , decimal value , Location loc )
@@ -2055,7 +2073,8 @@ public void EmitAttribute (FieldBuilder builder, decimal value, Location loc)
2055
2073
encoder . Encode ( ( uint ) bits [ 0 ] ) ;
2056
2074
encoder . EncodeEmptyNamedArguments ( ) ;
2057
2075
2058
- builder . SetCustomAttribute ( ( ConstructorInfo ) ctor . GetMetaInfo ( ) , encoder . ToArray ( ) ) ;
2076
+ builder . SetCustomAttribute ( ( ConstructorInfo ) ctor . GetMetaInfo ( ) , encoder . ToArray ( out var references ) ) ;
2077
+ module . AddAssemblyReferences ( references ) ;
2059
2078
}
2060
2079
}
2061
2080
@@ -2079,7 +2098,8 @@ public void EmitAttribute (MethodBuilder builder, StateMachine type)
2079
2098
encoder . EncodeTypeName ( type ) ;
2080
2099
encoder . EncodeEmptyNamedArguments ( ) ;
2081
2100
2082
- builder . SetCustomAttribute ( ( ConstructorInfo ) ctor . GetMetaInfo ( ) , encoder . ToArray ( ) ) ;
2101
+ builder . SetCustomAttribute ( ( ConstructorInfo ) ctor . GetMetaInfo ( ) , encoder . ToArray ( out var references ) ) ;
2102
+ module . AddAssemblyReferences ( references ) ;
2083
2103
}
2084
2104
}
2085
2105
0 commit comments