diff --git a/Mono.Cecil/AssemblyWriter.cs b/Mono.Cecil/AssemblyWriter.cs index 836aa2172..5678eb505 100644 --- a/Mono.Cecil/AssemblyWriter.cs +++ b/Mono.Cecil/AssemblyWriter.cs @@ -1905,7 +1905,10 @@ static ElementType GetConstantType (TypeReference constant_type, object constant return ElementType.Class; case ElementType.String: - return ElementType.String; + if (constant is string) + return ElementType.String; + else + return GetConstantType (constant.GetType ()); case ElementType.Object: return GetConstantType (constant.GetType ()); case ElementType.Array: @@ -2201,7 +2204,7 @@ SignatureWriter GetConstantSignature (ElementType type, object value) signature.WriteInt32 (0); break; case ElementType.String: - signature.WriteConstantString ((string) value); + signature.WriteConstantString (value); break; default: signature.WriteConstantPrimitive (value); @@ -2904,10 +2907,13 @@ bool TryWriteElementType (TypeReference type) return true; } - public void WriteConstantString (string value) + public void WriteConstantString (object value) { if (value != null) - WriteBytes (Encoding.Unicode.GetBytes (value)); + if (value is string v) + WriteBytes (Encoding.Unicode.GetBytes (v)); + else + WritePrimitiveValue (value); else WriteByte (0xff); } diff --git a/Test/Mono.Cecil.Tests/FieldTests.cs b/Test/Mono.Cecil.Tests/FieldTests.cs index 6cbbb28a7..6e40a9717 100644 --- a/Test/Mono.Cecil.Tests/FieldTests.cs +++ b/Test/Mono.Cecil.Tests/FieldTests.cs @@ -341,6 +341,12 @@ public void ConstantCoalescing () Assert.IsTrue (field.HasConstant); Assert.IsInstanceOf (typeof (char), field.Constant); Assert.AreEqual ('s', field.Constant); + + field = fields.GetField ("string_sbyte"); + Assert.AreEqual ("System.String", field.FieldType.FullName); + Assert.IsTrue (field.HasConstant); + Assert.IsInstanceOf (typeof (sbyte), field.Constant); + Assert.AreEqual ((sbyte)0x20, field.Constant); }); } diff --git a/Test/Resources/il/types.il b/Test/Resources/il/types.il index 4c9acafb5..65eb9f25e 100644 --- a/Test/Resources/il/types.il +++ b/Test/Resources/il/types.il @@ -43,4 +43,5 @@ .field private static literal char char_int16 = int16(0x0001) .field private static literal int16 int16_char = char(0x0073) .field private static literal int32 int32_nullref = nullref + .field private static literal string string_sbyte = int8(0x20) }