Initial Silverlight compatibility work
diff --git a/src/ProtocolBuffers/ByteString.cs b/src/ProtocolBuffers/ByteString.cs
index 0d67a53..0d027b7 100644
--- a/src/ProtocolBuffers/ByteString.cs
+++ b/src/ProtocolBuffers/ByteString.cs
@@ -116,7 +116,7 @@
     }
 
     public string ToString(Encoding encoding) {
-      return encoding.GetString(bytes);
+      return encoding.GetString(bytes, 0, bytes.Length);
     }
 
     public string ToStringUtf8() {
diff --git a/src/ProtocolBuffers/CodedInputStream.cs b/src/ProtocolBuffers/CodedInputStream.cs
index 132773c..313bddf 100644
--- a/src/ProtocolBuffers/CodedInputStream.cs
+++ b/src/ProtocolBuffers/CodedInputStream.cs
@@ -235,8 +235,8 @@
         bufferPos += size;
         return result;
       }
-      // Slow path:  Build a byte array first then copy it.
-      return Encoding.UTF8.GetString(ReadRawBytes(size));
+      // Slow path: Build a byte array first then copy it.
+      return Encoding.UTF8.GetString(ReadRawBytes(size), 0, size);
     }
 
     /// <summary>
diff --git a/src/ProtocolBuffers/FieldSet.cs b/src/ProtocolBuffers/FieldSet.cs
index 39b2a69..f084afa 100644
--- a/src/ProtocolBuffers/FieldSet.cs
+++ b/src/ProtocolBuffers/FieldSet.cs
@@ -62,8 +62,8 @@
     }
 
     public static FieldSet CreateInstance() {
-      // Use SortedList to keep fields in the canonical order
-      return new FieldSet(new SortedList<FieldDescriptor, object>());
+      // Use SortedDictionary to keep fields in the canonical order
+      return new FieldSet(new SortedDictionary<FieldDescriptor, object>());
     }
 
     /// <summary>
@@ -82,7 +82,7 @@
       }
 
       if (hasRepeats) {
-        var tmp = new SortedList<FieldDescriptor, object>();
+        var tmp = new SortedDictionary<FieldDescriptor, object>();
         foreach (KeyValuePair<FieldDescriptor, object> entry in fields) {
           IList<object> list = entry.Value as IList<object>;
           tmp[entry.Key] = list == null ? entry.Value : Lists.AsReadOnly(list);
diff --git a/src/ProtocolBuffers/GeneratedMessage.cs b/src/ProtocolBuffers/GeneratedMessage.cs
index d874759..055bc72 100644
--- a/src/ProtocolBuffers/GeneratedMessage.cs
+++ b/src/ProtocolBuffers/GeneratedMessage.cs
@@ -66,8 +66,8 @@
 
     internal IDictionary<FieldDescriptor, Object> GetMutableFieldMap() {
 
-      // Use a SortedList so we'll end up serializing fields in order
-      var ret = new SortedList<FieldDescriptor, object>();
+      // Use a SortedDictionary so we'll end up serializing fields in order
+      var ret = new SortedDictionary<FieldDescriptor, object>();
       MessageDescriptor descriptor = DescriptorForType;
       foreach (FieldDescriptor field in descriptor.Fields) {
         IFieldAccessor<TMessage, TBuilder> accessor = InternalFieldAccessors[field];
diff --git a/src/ProtocolBuffers/NameHelpers.cs b/src/ProtocolBuffers/NameHelpers.cs
index 8b297f9..cf4931d 100644
--- a/src/ProtocolBuffers/NameHelpers.cs
+++ b/src/ProtocolBuffers/NameHelpers.cs
@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Text;
+using System.Globalization;
 
 namespace Google.ProtocolBuffers {
   /// <summary>
@@ -31,7 +32,7 @@
         char c = input[i];
         if ('a' <= c && c <= 'z') {
           if (capitaliseNext) {
-            result.Append(char.ToUpperInvariant(c));
+            result.Append(char.ToUpper(c, CultureInfo.InvariantCulture));
           } else {
             result.Append(c);
           }
@@ -40,7 +41,7 @@
           if (i == 0 && !pascal) {
             // Force first letter to lower-case unless explicitly told to
             // capitalize it.
-            result.Append(char.ToLowerInvariant(c));
+            result.Append(char.ToLower(c, CultureInfo.InvariantCulture));
           } else {
             // Capital letters after the first are left as-is.
             result.Append(c);
diff --git a/src/ProtocolBuffers/TextFormat.cs b/src/ProtocolBuffers/TextFormat.cs
index fc8030f..ba7b467 100644
--- a/src/ProtocolBuffers/TextFormat.cs
+++ b/src/ProtocolBuffers/TextFormat.cs
@@ -537,7 +537,7 @@
         if (field == null) {
           // Explicitly specify the invariant culture so that this code does not break when
           // executing in Turkey.
-          String lowerName = name.ToLowerInvariant();
+          String lowerName = name.ToLower(CultureInfo.InvariantCulture);
           field = type.FindDescriptor<FieldDescriptor>(lowerName);
           // If the case-insensitive match worked but the field is NOT a group,
           // TODO(jonskeet): What? Java comment ends here!
diff --git a/src/ProtocolBuffers/TextTokenizer.cs b/src/ProtocolBuffers/TextTokenizer.cs
index 8d63999..d25a587 100644
--- a/src/ProtocolBuffers/TextTokenizer.cs
+++ b/src/ProtocolBuffers/TextTokenizer.cs
@@ -69,9 +69,15 @@
     /// </summary>
     private int previousColumn = 0;
 
+#if SILVERLIGHT
+    private const RegexOptions CompiledRegexWhereAvailable = RegexOptions.None;
+#else
+    private const RegexOptions CompiledRegexWhereAvailable = RegexOptions.Compiled;
+#endif
+
     // Note: atomic groups used to mimic possessive quantifiers in Java in both of these regexes
     private static readonly Regex WhitespaceAndCommentPattern = new Regex("\\G(?>(\\s|(#.*$))+)", 
-        RegexOptions.Compiled | RegexOptions.Multiline);
+        CompiledRegexWhereAvailable | RegexOptions.Multiline);
     private static readonly Regex TokenPattern = new Regex(
       "\\G[a-zA-Z_](?>[0-9a-zA-Z_+-]*)|" +              // an identifier
       "\\G[0-9+-](?>[0-9a-zA-Z_.+-]*)|" +                  // a number
@@ -79,9 +85,9 @@
       "\\G\'(?>([^\"\\\n\\\\]|\\\\.)*)(\'|\\\\?$)",      // a single-quoted string
       RegexOptions.Compiled | RegexOptions.Multiline);
 
-    private static readonly Regex DoubleInfinity = new Regex("^-?inf(inity)?$", RegexOptions.Compiled | RegexOptions.IgnoreCase);
-    private static readonly Regex FloatInfinity = new Regex("^-?inf(inity)?f?$", RegexOptions.Compiled | RegexOptions.IgnoreCase);
-    private static readonly Regex FloatNan = new Regex("^nanf?$", RegexOptions.Compiled | RegexOptions.IgnoreCase);
+    private static readonly Regex DoubleInfinity = new Regex("^-?inf(inity)?$", CompiledRegexWhereAvailable | RegexOptions.IgnoreCase);
+    private static readonly Regex FloatInfinity = new Regex("^-?inf(inity)?f?$", CompiledRegexWhereAvailable | RegexOptions.IgnoreCase);
+    private static readonly Regex FloatNan = new Regex("^nanf?$", CompiledRegexWhereAvailable | RegexOptions.IgnoreCase);
 
     /** Construct a tokenizer that parses tokens from the given text. */
     public TextTokenizer(string text) {
diff --git a/src/ProtocolBuffers/UnknownFieldSet.cs b/src/ProtocolBuffers/UnknownFieldSet.cs
index 9de0970..f065510 100644
--- a/src/ProtocolBuffers/UnknownFieldSet.cs
+++ b/src/ProtocolBuffers/UnknownFieldSet.cs
@@ -240,10 +240,10 @@
     public sealed class Builder
     {
       /// <summary>
-      /// Mapping from number to field. Note that by using a SortedList we ensure
+      /// Mapping from number to field. Note that by using a SortedDictionary we ensure
       /// that the fields will be serialized in ascending order.
       /// </summary>
-      private IDictionary<int, UnknownField> fields = new SortedList<int, UnknownField>();
+      private IDictionary<int, UnknownField> fields = new SortedDictionary<int, UnknownField>();
 
       // Optimization:  We keep around a builder for the last field that was
       // modified so that we can efficiently add to it multiple times in a