Merge pull request #680 from jskeet/aptca

Allow partially-trusted callers again.
diff --git a/csharp/src/Google.Protobuf.Test/CodedInputStreamTest.cs b/csharp/src/Google.Protobuf.Test/CodedInputStreamTest.cs
index fa88d40..6e25fa3 100644
--- a/csharp/src/Google.Protobuf.Test/CodedInputStreamTest.cs
+++ b/csharp/src/Google.Protobuf.Test/CodedInputStreamTest.cs
@@ -59,20 +59,20 @@
         /// </summary>

         private static void AssertReadVarint(byte[] data, ulong value)

         {

-            CodedInputStream input = CodedInputStream.CreateInstance(data);

+            CodedInputStream input = new CodedInputStream(data);

             Assert.AreEqual((uint) value, input.ReadRawVarint32());

 

-            input = CodedInputStream.CreateInstance(data);

+            input = new CodedInputStream(data);

             Assert.AreEqual(value, input.ReadRawVarint64());

             Assert.IsTrue(input.IsAtEnd);

 

             // Try different block sizes.

             for (int bufferSize = 1; bufferSize <= 16; bufferSize *= 2)

             {

-                input = CodedInputStream.CreateInstance(new SmallBlockInputStream(data, bufferSize));

+                input = new CodedInputStream(new SmallBlockInputStream(data, bufferSize));

                 Assert.AreEqual((uint) value, input.ReadRawVarint32());

 

-                input = CodedInputStream.CreateInstance(new SmallBlockInputStream(data, bufferSize));

+                input = new CodedInputStream(new SmallBlockInputStream(data, bufferSize));

                 Assert.AreEqual(value, input.ReadRawVarint64());

                 Assert.IsTrue(input.IsAtEnd);

             }

@@ -95,11 +95,11 @@
         /// </summary>

         private static void AssertReadVarintFailure(InvalidProtocolBufferException expected, byte[] data)

         {

-            CodedInputStream input = CodedInputStream.CreateInstance(data);

+            CodedInputStream input = new CodedInputStream(data);

             var exception = Assert.Throws<InvalidProtocolBufferException>(() => input.ReadRawVarint32());

             Assert.AreEqual(expected.Message, exception.Message);

 

-            input = CodedInputStream.CreateInstance(data);

+            input = new CodedInputStream(data);

             exception = Assert.Throws<InvalidProtocolBufferException>(() => input.ReadRawVarint64());

             Assert.AreEqual(expected.Message, exception.Message);

 

@@ -152,14 +152,14 @@
         /// </summary>

         private static void AssertReadLittleEndian32(byte[] data, uint value)

         {

-            CodedInputStream input = CodedInputStream.CreateInstance(data);

+            CodedInputStream input = new CodedInputStream(data);

             Assert.AreEqual(value, input.ReadRawLittleEndian32());

             Assert.IsTrue(input.IsAtEnd);

 

             // Try different block sizes.

             for (int blockSize = 1; blockSize <= 16; blockSize *= 2)

             {

-                input = CodedInputStream.CreateInstance(

+                input = new CodedInputStream(

                     new SmallBlockInputStream(data, blockSize));

                 Assert.AreEqual(value, input.ReadRawLittleEndian32());

                 Assert.IsTrue(input.IsAtEnd);

@@ -172,14 +172,14 @@
         /// </summary>

         private static void AssertReadLittleEndian64(byte[] data, ulong value)

         {

-            CodedInputStream input = CodedInputStream.CreateInstance(data);

+            CodedInputStream input = new CodedInputStream(data);

             Assert.AreEqual(value, input.ReadRawLittleEndian64());

             Assert.IsTrue(input.IsAtEnd);

 

             // Try different block sizes.

             for (int blockSize = 1; blockSize <= 16; blockSize *= 2)

             {

-                input = CodedInputStream.CreateInstance(

+                input = new CodedInputStream(

                     new SmallBlockInputStream(data, blockSize));

                 Assert.AreEqual(value, input.ReadRawLittleEndian64());

                 Assert.IsTrue(input.IsAtEnd);

@@ -269,7 +269,7 @@
         public void ReadMaliciouslyLargeBlob()

         {

             MemoryStream ms = new MemoryStream();

-            CodedOutputStream output = CodedOutputStream.CreateInstance(ms);

+            CodedOutputStream output = new CodedOutputStream(ms);

 

             uint tag = WireFormat.MakeTag(1, WireFormat.WireType.LengthDelimited);

             output.WriteRawVarint32(tag);

@@ -278,7 +278,7 @@
             output.Flush();

             ms.Position = 0;

 

-            CodedInputStream input = CodedInputStream.CreateInstance(ms);

+            CodedInputStream input = new CodedInputStream(ms);

             uint testtag;

             Assert.IsTrue(input.ReadTag(out testtag));

             Assert.AreEqual(tag, testtag);

@@ -335,7 +335,7 @@
             // Have to use a Stream rather than ByteString.CreateCodedInput as SizeLimit doesn't

             // apply to the latter case.

             MemoryStream ms = new MemoryStream(TestUtil.GetAllSet().ToByteString().ToByteArray());

-            CodedInputStream input = CodedInputStream.CreateInstance(ms);

+            CodedInputStream input = new CodedInputStream(ms);

             input.SetSizeLimit(16);

 

             Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.ParseFrom(input));

@@ -344,7 +344,7 @@
         [Test]

         public void ResetSizeCounter()

         {

-            CodedInputStream input = CodedInputStream.CreateInstance(

+            CodedInputStream input = new CodedInputStream(

                 new SmallBlockInputStream(new byte[256], 8));

             input.SetSizeLimit(16);

             input.ReadRawBytes(16);

@@ -366,7 +366,7 @@
         public void ReadInvalidUtf8()

         {

             MemoryStream ms = new MemoryStream();

-            CodedOutputStream output = CodedOutputStream.CreateInstance(ms);

+            CodedOutputStream output = new CodedOutputStream(ms);

 

             uint tag = WireFormat.MakeTag(1, WireFormat.WireType.LengthDelimited);

             output.WriteRawVarint32(tag);

@@ -375,7 +375,7 @@
             output.Flush();

             ms.Position = 0;

 

-            CodedInputStream input = CodedInputStream.CreateInstance(ms);

+            CodedInputStream input = new CodedInputStream(ms);

 

             uint actualTag;

             Assert.IsTrue(input.ReadTag(out actualTag));

@@ -409,7 +409,7 @@
         public void TestNegativeEnum()

         {

             byte[] bytes = { 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01 };

-            CodedInputStream input = CodedInputStream.CreateInstance(bytes);

+            CodedInputStream input = new CodedInputStream(bytes);

             Assert.AreEqual((int)SampleEnum.NegativeValue, input.ReadEnum());

             Assert.IsTrue(input.IsAtEnd);

         }

@@ -420,7 +420,7 @@
         {

             using (var ms = new MemoryStream())

             {

-                CodedOutputStream output = CodedOutputStream.CreateInstance(ms);

+                CodedOutputStream output = new CodedOutputStream(ms);

                 output.WriteTag(1, WireFormat.WireType.LengthDelimited);

                 output.WriteBytes(ByteString.CopyFrom(new byte[100]));

                 output.WriteTag(2, WireFormat.WireType.LengthDelimited);

@@ -428,7 +428,7 @@
                 output.Flush();

 

                 ms.Position = 0;

-                CodedInputStream input = CodedInputStream.CreateInstance(ms, new byte[ms.Length / 2]);

+                CodedInputStream input = new CodedInputStream(ms, new byte[ms.Length / 2]);

 

                 uint tag;

                 Assert.IsTrue(input.ReadTag(out tag));

diff --git a/csharp/src/Google.Protobuf.Test/CodedOutputStreamTest.cs b/csharp/src/Google.Protobuf.Test/CodedOutputStreamTest.cs
index c3d92a6..af32917 100644
--- a/csharp/src/Google.Protobuf.Test/CodedOutputStreamTest.cs
+++ b/csharp/src/Google.Protobuf.Test/CodedOutputStreamTest.cs
@@ -49,7 +49,7 @@
             if ((value >> 32) == 0)

             {

                 MemoryStream rawOutput = new MemoryStream();

-                CodedOutputStream output = CodedOutputStream.CreateInstance(rawOutput);

+                CodedOutputStream output = new CodedOutputStream(rawOutput);

                 output.WriteRawVarint32((uint) value);

                 output.Flush();

                 Assert.AreEqual(data, rawOutput.ToArray());

@@ -59,7 +59,7 @@
 

             {

                 MemoryStream rawOutput = new MemoryStream();

-                CodedOutputStream output = CodedOutputStream.CreateInstance(rawOutput);

+                CodedOutputStream output = new CodedOutputStream(rawOutput);

                 output.WriteRawVarint64(value);

                 output.Flush();

                 Assert.AreEqual(data, rawOutput.ToArray());

@@ -76,7 +76,7 @@
                 {

                     MemoryStream rawOutput = new MemoryStream();

                     CodedOutputStream output =

-                        CodedOutputStream.CreateInstance(rawOutput, bufferSize);

+                        new CodedOutputStream(rawOutput, bufferSize);

                     output.WriteRawVarint32((uint) value);

                     output.Flush();

                     Assert.AreEqual(data, rawOutput.ToArray());

@@ -84,7 +84,7 @@
 

                 {

                     MemoryStream rawOutput = new MemoryStream();

-                    CodedOutputStream output = CodedOutputStream.CreateInstance(rawOutput, bufferSize);

+                    CodedOutputStream output = new CodedOutputStream(rawOutput, bufferSize);

                     output.WriteRawVarint64(value);

                     output.Flush();

                     Assert.AreEqual(data, rawOutput.ToArray());

@@ -134,7 +134,7 @@
         private static void AssertWriteLittleEndian32(byte[] data, uint value)

         {

             MemoryStream rawOutput = new MemoryStream();

-            CodedOutputStream output = CodedOutputStream.CreateInstance(rawOutput);

+            CodedOutputStream output = new CodedOutputStream(rawOutput);

             output.WriteRawLittleEndian32(value);

             output.Flush();

             Assert.AreEqual(data, rawOutput.ToArray());

@@ -143,7 +143,7 @@
             for (int bufferSize = 1; bufferSize <= 16; bufferSize *= 2)

             {

                 rawOutput = new MemoryStream();

-                output = CodedOutputStream.CreateInstance(rawOutput, bufferSize);

+                output = new CodedOutputStream(rawOutput, bufferSize);

                 output.WriteRawLittleEndian32(value);

                 output.Flush();

                 Assert.AreEqual(data, rawOutput.ToArray());

@@ -157,7 +157,7 @@
         private static void AssertWriteLittleEndian64(byte[] data, ulong value)

         {

             MemoryStream rawOutput = new MemoryStream();

-            CodedOutputStream output = CodedOutputStream.CreateInstance(rawOutput);

+            CodedOutputStream output = new CodedOutputStream(rawOutput);

             output.WriteRawLittleEndian64(value);

             output.Flush();

             Assert.AreEqual(data, rawOutput.ToArray());

@@ -166,7 +166,7 @@
             for (int blockSize = 1; blockSize <= 16; blockSize *= 2)

             {

                 rawOutput = new MemoryStream();

-                output = CodedOutputStream.CreateInstance(rawOutput, blockSize);

+                output = new CodedOutputStream(rawOutput, blockSize);

                 output.WriteRawLittleEndian64(value);

                 output.Flush();

                 Assert.AreEqual(data, rawOutput.ToArray());

@@ -201,7 +201,7 @@
             for (int blockSize = 1; blockSize < 256; blockSize *= 2)

             {

                 MemoryStream rawOutput = new MemoryStream();

-                CodedOutputStream output = CodedOutputStream.CreateInstance(rawOutput, blockSize);

+                CodedOutputStream output = new CodedOutputStream(rawOutput, blockSize);

                 message.WriteTo(output);

                 output.Flush();

                 Assert.AreEqual(rawBytes, rawOutput.ToArray());

@@ -276,7 +276,7 @@
             Assert.AreEqual(10, CodedOutputStream.ComputeEnumSize((int) SampleEnum.NegativeValue));

 

             byte[] bytes = new byte[10];

-            CodedOutputStream output = CodedOutputStream.CreateInstance(bytes);

+            CodedOutputStream output = new CodedOutputStream(bytes);

             output.WriteEnum((int) SampleEnum.NegativeValue);

 

             Assert.AreEqual(0, output.SpaceLeft);

@@ -293,7 +293,7 @@
             byte[] child = new byte[120];

             {

                 MemoryStream ms = new MemoryStream(child);

-                CodedOutputStream cout = CodedOutputStream.CreateInstance(ms, 20);

+                CodedOutputStream cout = new CodedOutputStream(ms, 20);

                 // Field 11: numeric value: 500

                 cout.WriteTag(11, WireFormat.WireType.Varint);

                 Assert.AreEqual(1, cout.Position);

@@ -314,7 +314,7 @@
 

             byte[] bytes = new byte[130];

             {

-                CodedOutputStream cout = CodedOutputStream.CreateInstance(bytes);

+                CodedOutputStream cout = new CodedOutputStream(bytes);

                 // Field 1: numeric value: 500

                 cout.WriteTag(1, WireFormat.WireType.Varint);

                 Assert.AreEqual(1, cout.Position);

@@ -334,7 +334,7 @@
             }

             // Now test Input stream:

             {

-                CodedInputStream cin = CodedInputStream.CreateInstance(new MemoryStream(bytes), new byte[50]);

+                CodedInputStream cin = new CodedInputStream(new MemoryStream(bytes), new byte[50]);

                 uint tag;

                 Assert.AreEqual(0, cin.Position);

                 // Field 1:

diff --git a/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs b/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs
index 33c4e10..322100d 100644
--- a/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs
+++ b/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs
@@ -221,7 +221,7 @@
         {
             uint packedTag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
             var stream = new MemoryStream();
-            var output = CodedOutputStream.CreateInstance(stream);
+            var output = new CodedOutputStream(stream);
             var length = CodedOutputStream.ComputeInt32Size(10)
                 + CodedOutputStream.ComputeInt32Size(999)
                 + CodedOutputStream.ComputeInt32Size(-1000);
@@ -237,7 +237,7 @@
             // actually packed.
             uint nonPackedTag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
             var field = new RepeatedField<int>();
-            var input = CodedInputStream.CreateInstance(stream);
+            var input = new CodedInputStream(stream);
             input.AssertNextTag(packedTag);
             field.AddEntriesFrom(input, FieldCodec.ForInt32(nonPackedTag));
             CollectionAssert.AreEqual(new[] { 10, 999, -1000 }, field);
@@ -249,7 +249,7 @@
         {
             uint nonPackedTag = WireFormat.MakeTag(10, WireFormat.WireType.Varint);
             var stream = new MemoryStream();
-            var output = CodedOutputStream.CreateInstance(stream);
+            var output = new CodedOutputStream(stream);
             output.WriteTag(nonPackedTag);
             output.WriteInt32(10);
             output.WriteTag(nonPackedTag);
@@ -263,7 +263,7 @@
             // actually not packed.
             uint packedTag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
             var field = new RepeatedField<int>();
-            var input = CodedInputStream.CreateInstance(stream);
+            var input = new CodedInputStream(stream);
             input.AssertNextTag(nonPackedTag);
             field.AddEntriesFrom(input, FieldCodec.ForInt32(packedTag));
             CollectionAssert.AreEqual(new[] { 10, 999, -1000 }, field);
@@ -275,7 +275,7 @@
         {
             uint tag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
             var stream = new MemoryStream();
-            var output = CodedOutputStream.CreateInstance(stream);
+            var output = new CodedOutputStream(stream);
             output.WriteTag(tag);
             output.WriteString("Foo");
             output.WriteTag(tag);
@@ -286,7 +286,7 @@
             stream.Position = 0;
 
             var field = new RepeatedField<string>();
-            var input = CodedInputStream.CreateInstance(stream);
+            var input = new CodedInputStream(stream);
             input.AssertNextTag(tag);
             field.AddEntriesFrom(input, FieldCodec.ForString(tag));
             CollectionAssert.AreEqual(new[] { "Foo", "", "Bar" }, field);
@@ -301,7 +301,7 @@
 
             uint tag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
             var stream = new MemoryStream();
-            var output = CodedOutputStream.CreateInstance(stream);
+            var output = new CodedOutputStream(stream);
             output.WriteTag(tag);
             output.WriteMessage(message1);
             output.WriteTag(tag);
@@ -310,7 +310,7 @@
             stream.Position = 0;
 
             var field = new RepeatedField<ForeignMessage>();
-            var input = CodedInputStream.CreateInstance(stream);
+            var input = new CodedInputStream(stream);
             input.AssertNextTag(tag);
             field.AddEntriesFrom(input, FieldCodec.ForMessage(tag, ForeignMessage.Parser));
             CollectionAssert.AreEqual(new[] { message1, message2}, field);
@@ -323,12 +323,12 @@
             uint tag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
             var field = new RepeatedField<int> { 10, 1000, 1000000 };
             var stream = new MemoryStream();
-            var output = CodedOutputStream.CreateInstance(stream);
+            var output = new CodedOutputStream(stream);
             field.WriteTo(output, FieldCodec.ForInt32(tag));
             output.Flush();
             stream.Position = 0;
 
-            var input = CodedInputStream.CreateInstance(stream);
+            var input = new CodedInputStream(stream);
             input.AssertNextTag(tag);
             var length = input.ReadLength();
             Assert.AreEqual(10, input.ReadInt32());
@@ -344,12 +344,12 @@
             uint tag = WireFormat.MakeTag(10, WireFormat.WireType.Varint);
             var field = new RepeatedField<int> { 10, 1000, 1000000};
             var stream = new MemoryStream();
-            var output = CodedOutputStream.CreateInstance(stream);
+            var output = new CodedOutputStream(stream);
             field.WriteTo(output, FieldCodec.ForInt32(tag));
             output.Flush();
             stream.Position = 0;
 
-            var input = CodedInputStream.CreateInstance(stream);
+            var input = new CodedInputStream(stream);
             input.AssertNextTag(tag);
             Assert.AreEqual(10, input.ReadInt32());
             input.AssertNextTag(tag);
@@ -365,12 +365,12 @@
             uint tag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
             var field = new RepeatedField<string> { "Foo", "", "Bar" };
             var stream = new MemoryStream();
-            var output = CodedOutputStream.CreateInstance(stream);
+            var output = new CodedOutputStream(stream);
             field.WriteTo(output, FieldCodec.ForString(tag));
             output.Flush();
             stream.Position = 0;
 
-            var input = CodedInputStream.CreateInstance(stream);
+            var input = new CodedInputStream(stream);
             input.AssertNextTag(tag);
             Assert.AreEqual("Foo", input.ReadString());
             input.AssertNextTag(tag);
@@ -388,12 +388,12 @@
             uint tag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
             var field = new RepeatedField<ForeignMessage> { message1, message2 };
             var stream = new MemoryStream();
-            var output = CodedOutputStream.CreateInstance(stream);
+            var output = new CodedOutputStream(stream);
             field.WriteTo(output, FieldCodec.ForMessage(tag, ForeignMessage.Parser));
             output.Flush();
             stream.Position = 0;
 
-            var input = CodedInputStream.CreateInstance(stream);
+            var input = new CodedInputStream(stream);
             input.AssertNextTag(tag);
             Assert.AreEqual(message1, input.ReadMessage(ForeignMessage.Parser));
             input.AssertNextTag(tag);
@@ -444,7 +444,7 @@
             int arraySize = 1 + 1 + (11 * 5);
             int msgSize = arraySize;
             byte[] bytes = new byte[msgSize];
-            CodedOutputStream output = CodedOutputStream.CreateInstance(bytes);
+            CodedOutputStream output = new CodedOutputStream(bytes);
             uint tag = WireFormat.MakeTag(8, WireFormat.WireType.Varint);
             for (int i = 0; i >= -5; i--)
             {
@@ -454,7 +454,7 @@
 
             Assert.AreEqual(0, output.SpaceLeft);
 
-            CodedInputStream input = CodedInputStream.CreateInstance(bytes);
+            CodedInputStream input = new CodedInputStream(bytes);
             Assert.IsTrue(input.ReadTag(out tag));
 
             RepeatedField<SampleEnum> values = new RepeatedField<SampleEnum>();
@@ -476,7 +476,7 @@
             int arraySize = 1 + (10 * 5);
             int msgSize = 1 + 1 + arraySize;
             byte[] bytes = new byte[msgSize];
-            CodedOutputStream output = CodedOutputStream.CreateInstance(bytes);
+            CodedOutputStream output = new CodedOutputStream(bytes);
             // Length-delimited to show we want the packed representation
             uint tag = WireFormat.MakeTag(8, WireFormat.WireType.LengthDelimited);
             output.WriteTag(tag);
@@ -492,7 +492,7 @@
             }
             Assert.AreEqual(0, output.SpaceLeft);
 
-            CodedInputStream input = CodedInputStream.CreateInstance(bytes);
+            CodedInputStream input = new CodedInputStream(bytes);
             Assert.IsTrue(input.ReadTag(out tag));
 
             RepeatedField<SampleEnum> values = new RepeatedField<SampleEnum>();
diff --git a/csharp/src/Google.Protobuf.Test/FieldCodecTest.cs b/csharp/src/Google.Protobuf.Test/FieldCodecTest.cs
index c6ed2a2..6f145a4 100644
--- a/csharp/src/Google.Protobuf.Test/FieldCodecTest.cs
+++ b/csharp/src/Google.Protobuf.Test/FieldCodecTest.cs
@@ -120,11 +120,11 @@
             public void TestRoundTripRaw()
             {
                 var stream = new MemoryStream();
-                var codedOutput = CodedOutputStream.CreateInstance(stream);
+                var codedOutput = new CodedOutputStream(stream);
                 codec.ValueWriter(codedOutput, sampleValue);
                 codedOutput.Flush();
                 stream.Position = 0;
-                var codedInput = CodedInputStream.CreateInstance(stream);
+                var codedInput = new CodedInputStream(stream);
                 Assert.AreEqual(sampleValue, codec.ValueReader(codedInput));
                 Assert.IsTrue(codedInput.IsAtEnd);
             }
@@ -132,11 +132,11 @@
             public void TestRoundTripWithTag()
             {
                 var stream = new MemoryStream();
-                var codedOutput = CodedOutputStream.CreateInstance(stream);
+                var codedOutput = new CodedOutputStream(stream);
                 codec.WriteTagAndValue(codedOutput, sampleValue);
                 codedOutput.Flush();
                 stream.Position = 0;
-                var codedInput = CodedInputStream.CreateInstance(stream);
+                var codedInput = new CodedInputStream(stream);
                 codedInput.AssertNextTag(codec.Tag);
                 Assert.AreEqual(sampleValue, codec.Read(codedInput));
                 Assert.IsTrue(codedInput.IsAtEnd);
@@ -145,7 +145,7 @@
             public void TestCalculateSizeWithTag()
             {
                 var stream = new MemoryStream();
-                var codedOutput = CodedOutputStream.CreateInstance(stream);
+                var codedOutput = new CodedOutputStream(stream);
                 codec.WriteTagAndValue(codedOutput, sampleValue);
                 codedOutput.Flush();
                 Assert.AreEqual(stream.Position, codec.CalculateSizeWithTag(sampleValue));
@@ -155,7 +155,7 @@
             {
                 // WriteTagAndValue ignores default values
                 var stream = new MemoryStream();
-                var codedOutput = CodedOutputStream.CreateInstance(stream);
+                var codedOutput = new CodedOutputStream(stream);
                 codec.WriteTagAndValue(codedOutput, codec.DefaultValue);
                 codedOutput.Flush();
                 Assert.AreEqual(0, stream.Position);
@@ -168,13 +168,13 @@
                 // The plain ValueWriter/ValueReader delegates don't.
                 if (codec.DefaultValue != null) // This part isn't appropriate for message types.
                 {
-                    codedOutput = CodedOutputStream.CreateInstance(stream);
+                    codedOutput = new CodedOutputStream(stream);
                     codec.ValueWriter(codedOutput, codec.DefaultValue);
                     codedOutput.Flush();
                     Assert.AreNotEqual(0, stream.Position);
                     Assert.AreEqual(stream.Position, codec.ValueSizeCalculator(codec.DefaultValue));
                     stream.Position = 0;
-                    var codedInput = CodedInputStream.CreateInstance(stream);
+                    var codedInput = new CodedInputStream(stream);
                     Assert.AreEqual(codec.DefaultValue, codec.ValueReader(codedInput));
                 }
             }
diff --git a/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs b/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs
index 140b878..2b6265c 100644
--- a/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs
+++ b/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs
@@ -253,7 +253,7 @@
         {

             // Hand-craft the stream to contain a single entry with just a value.

             var memoryStream = new MemoryStream();

-            var output = CodedOutputStream.CreateInstance(memoryStream);

+            var output = new CodedOutputStream(memoryStream);

             output.WriteTag(TestMap.MapInt32ForeignMessageFieldNumber, WireFormat.WireType.LengthDelimited);

             var nestedMessage = new ForeignMessage { C = 20 };

             // Size of the entry (tag, size written by WriteMessage, data written by WriteMessage)

@@ -271,7 +271,7 @@
         {

             // Hand-craft the stream to contain a single entry with three fields

             var memoryStream = new MemoryStream();

-            var output = CodedOutputStream.CreateInstance(memoryStream);

+            var output = new CodedOutputStream(memoryStream);

 

             output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited);

 

@@ -298,7 +298,7 @@
         public void MapFieldOrderIsIrrelevant()

         {

             var memoryStream = new MemoryStream();

-            var output = CodedOutputStream.CreateInstance(memoryStream);

+            var output = new CodedOutputStream(memoryStream);

 

             output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited);

 

@@ -322,7 +322,7 @@
         public void MapNonContiguousEntries()

         {

             var memoryStream = new MemoryStream();

-            var output = CodedOutputStream.CreateInstance(memoryStream);

+            var output = new CodedOutputStream(memoryStream);

 

             // Message structure:

             // Entry for MapInt32Int32

@@ -373,7 +373,7 @@
         public void DuplicateKeys_LastEntryWins()

         {

             var memoryStream = new MemoryStream();

-            var output = CodedOutputStream.CreateInstance(memoryStream);

+            var output = new CodedOutputStream(memoryStream);

 

             var key = 10;

             var value1 = 20;

diff --git a/csharp/src/Google.Protobuf.Test/TestCornerCases.cs b/csharp/src/Google.Protobuf.Test/TestCornerCases.cs
index b270a6f..03fa185 100644
--- a/csharp/src/Google.Protobuf.Test/TestCornerCases.cs
+++ b/csharp/src/Google.Protobuf.Test/TestCornerCases.cs
@@ -50,7 +50,7 @@
             Assert.AreEqual(58, msg.CalculateSize());

 

             byte[] bytes = new byte[58];

-            CodedOutputStream output = CodedOutputStream.CreateInstance(bytes);

+            CodedOutputStream output = new CodedOutputStream(bytes);

 

             msg.WriteTo(output);

             Assert.AreEqual(0, output.SpaceLeft);

diff --git a/csharp/src/Google.Protobuf.Test/WellKnownTypes/WrappersTest.cs b/csharp/src/Google.Protobuf.Test/WellKnownTypes/WrappersTest.cs
index 670bc5f..d2a0705 100644
--- a/csharp/src/Google.Protobuf.Test/WellKnownTypes/WrappersTest.cs
+++ b/csharp/src/Google.Protobuf.Test/WellKnownTypes/WrappersTest.cs
@@ -309,7 +309,7 @@
             var valueTag = WireFormat.MakeTag(Int32Value.ValueFieldNumber, WireFormat.WireType.Varint);
             using (var stream = new MemoryStream())
             {
-                var coded = CodedOutputStream.CreateInstance(stream);
+                var coded = new CodedOutputStream(stream);
                 coded.WriteTag(wrapperTag);
                 coded.WriteLength(2); // valueTag + a value 0, each one byte
                 coded.WriteTag(valueTag);
diff --git a/csharp/src/Google.Protobuf/ByteString.cs b/csharp/src/Google.Protobuf/ByteString.cs
index 329f47f..cf5468d 100644
--- a/csharp/src/Google.Protobuf/ByteString.cs
+++ b/csharp/src/Google.Protobuf/ByteString.cs
@@ -203,7 +203,7 @@
         public CodedInputStream CreateCodedInput()

         {

             // We trust CodedInputStream not to reveal the provided byte array or modify it

-            return CodedInputStream.CreateInstance(bytes);

+            return new CodedInputStream(bytes);

         }

 

         public static bool operator ==(ByteString lhs, ByteString rhs)

diff --git a/csharp/src/Google.Protobuf/CodedInputStream.cs b/csharp/src/Google.Protobuf/CodedInputStream.cs
index ef7cf11..f2e1d66 100644
--- a/csharp/src/Google.Protobuf/CodedInputStream.cs
+++ b/csharp/src/Google.Protobuf/CodedInputStream.cs
@@ -93,43 +93,19 @@
         private int sizeLimit = DefaultSizeLimit;

 

         #region Construction

-

-        /// <summary>

-        /// Creates a new CodedInputStream reading data from the given

-        /// stream.

-        /// </summary>

-        public static CodedInputStream CreateInstance(Stream input)

-        {

-            return new CodedInputStream(input);

-        }

-        /// <summary>

-        /// Creates a new CodedInputStream reading data from the given

-        /// stream and a pre-allocated memory buffer.

-        /// </summary>

-        public static CodedInputStream CreateInstance(Stream input, byte[] buffer)

-        {

-            return new CodedInputStream(input, buffer);

-        }

-

         /// <summary>

         /// Creates a new CodedInputStream reading data from the given

         /// byte array.

         /// </summary>

-        public static CodedInputStream CreateInstance(byte[] buf)

+        public CodedInputStream(byte[] buf) : this(buf, 0, buf.Length)

         {

-            return new CodedInputStream(buf, 0, buf.Length);

         }

 

         /// <summary>

         /// Creates a new CodedInputStream that reads from the given

         /// byte array slice.

         /// </summary>

-        public static CodedInputStream CreateInstance(byte[] buf, int offset, int length)

-        {

-            return new CodedInputStream(buf, offset, length);

-        }

-

-        private CodedInputStream(byte[] buffer, int offset, int length)

+        public CodedInputStream(byte[] buffer, int offset, int length)

         {

             this.buffer = buffer;

             this.bufferPos = offset;

@@ -137,14 +113,21 @@
             this.input = null;

         }

 

-        private CodedInputStream(Stream input)

+        /// <summary>

+        /// Creates a new CodedInputStream reading data from the given stream.

+        /// </summary>

+        public CodedInputStream(Stream input)

         {

             this.buffer = new byte[BufferSize];

             this.bufferSize = 0;

             this.input = input;

         }

 

-        private CodedInputStream(Stream input, byte[] buffer)

+        /// <summary>

+        /// Creates a new CodedInputStream reading data from the given

+        /// stream, with a pre-allocated buffer.

+        /// </summary>

+        internal CodedInputStream(Stream input, byte[] buffer)

         {

             this.buffer = buffer;

             this.bufferSize = 0;

diff --git a/csharp/src/Google.Protobuf/CodedOutputStream.cs b/csharp/src/Google.Protobuf/CodedOutputStream.cs
index b91d6d7..b084c14 100644
--- a/csharp/src/Google.Protobuf/CodedOutputStream.cs
+++ b/csharp/src/Google.Protobuf/CodedOutputStream.cs
@@ -65,7 +65,20 @@
         private readonly Stream output;

 

         #region Construction

+        /// <summary>

+        /// Creates a new CodedOutputStream that writes directly to the given

+        /// byte array. If more bytes are written than fit in the array,

+        /// OutOfSpaceException will be thrown.

+        /// </summary>

+        public CodedOutputStream(byte[] flatArray) : this(flatArray, 0, flatArray.Length)

+        {

+        }

 

+        /// <summary>

+        /// Creates a new CodedOutputStream that writes directly to the given

+        /// byte array slice. If more bytes are written than fit in the array,

+        /// OutOfSpaceException will be thrown.

+        /// </summary>

         private CodedOutputStream(byte[] buffer, int offset, int length)

         {

             this.output = null;

@@ -85,40 +98,17 @@
         /// <summary>

         /// Creates a new CodedOutputStream which write to the given stream.

         /// </summary>

-        public static CodedOutputStream CreateInstance(Stream output)

+        public CodedOutputStream(Stream output) : this(output, DefaultBufferSize)

         {

-            return CreateInstance(output, DefaultBufferSize);

         }

 

         /// <summary>

         /// Creates a new CodedOutputStream which write to the given stream and uses

         /// the specified buffer size.

         /// </summary>

-        public static CodedOutputStream CreateInstance(Stream output, int bufferSize)

+        public CodedOutputStream(Stream output, int bufferSize) : this(output, new byte[bufferSize])

         {

-            return new CodedOutputStream(output, new byte[bufferSize]);

-        }

-

-        /// <summary>

-        /// Creates a new CodedOutputStream that writes directly to the given

-        /// byte array. If more bytes are written than fit in the array,

-        /// OutOfSpaceException will be thrown.

-        /// </summary>

-        public static CodedOutputStream CreateInstance(byte[] flatArray)

-        {

-            return CreateInstance(flatArray, 0, flatArray.Length);

-        }

-

-        /// <summary>

-        /// Creates a new CodedOutputStream that writes directly to the given

-        /// byte array slice. If more bytes are written than fit in the array,

-        /// OutOfSpaceException will be thrown.

-        /// </summary>

-        public static CodedOutputStream CreateInstance(byte[] flatArray, int offset, int length)

-        {

-            return new CodedOutputStream(flatArray, offset, length);

-        }

-

+        }    

         #endregion

 

         /// <summary>

diff --git a/csharp/src/Google.Protobuf/MessageExtensions.cs b/csharp/src/Google.Protobuf/MessageExtensions.cs
index 7bd7993..6e7d47b 100644
--- a/csharp/src/Google.Protobuf/MessageExtensions.cs
+++ b/csharp/src/Google.Protobuf/MessageExtensions.cs
@@ -43,7 +43,7 @@
         {
             Preconditions.CheckNotNull(message, "message");
             Preconditions.CheckNotNull(data, "data");
-            CodedInputStream input = CodedInputStream.CreateInstance(data);
+            CodedInputStream input = new CodedInputStream(data);
             message.MergeFrom(input);
             input.CheckLastTagWas(0);
         }
@@ -61,7 +61,7 @@
         {
             Preconditions.CheckNotNull(message, "message");
             Preconditions.CheckNotNull(input, "input");
-            CodedInputStream codedInput = CodedInputStream.CreateInstance(input);
+            CodedInputStream codedInput = new CodedInputStream(input);
             message.MergeFrom(codedInput);
             codedInput.CheckLastTagWas(0);
         }
@@ -79,7 +79,7 @@
         {
             Preconditions.CheckNotNull(message, "message");
             byte[] result = new byte[message.CalculateSize()];
-            CodedOutputStream output = CodedOutputStream.CreateInstance(result);
+            CodedOutputStream output = new CodedOutputStream(result);
             message.WriteTo(output);
             output.CheckNoSpaceLeft();
             return result;
@@ -89,7 +89,7 @@
         {
             Preconditions.CheckNotNull(message, "message");
             Preconditions.CheckNotNull(output, "output");
-            CodedOutputStream codedOutput = CodedOutputStream.CreateInstance(output);
+            CodedOutputStream codedOutput = new CodedOutputStream(output);
             message.WriteTo(codedOutput);
             codedOutput.Flush();
         }
@@ -98,7 +98,7 @@
         {
             Preconditions.CheckNotNull(message, "message");
             Preconditions.CheckNotNull(output, "output");
-            CodedOutputStream codedOutput = CodedOutputStream.CreateInstance(output);
+            CodedOutputStream codedOutput = new CodedOutputStream(output);
             codedOutput.WriteRawVarint32((uint)message.CalculateSize());
             message.WriteTo(codedOutput);
             codedOutput.Flush();