- Added CSharpServiceType NONE to skip service generation.
- Defaulted service_generator_type to NONE
- Added /protos/extest/unittest_generic_services.proto to test services
- Migrated unit tests to use the new generic services for testing
diff --git a/src/ProtocolBuffers.Test/DescriptorsTest.cs b/src/ProtocolBuffers.Test/DescriptorsTest.cs
index c5223f9..f3c03cd 100644
--- a/src/ProtocolBuffers.Test/DescriptorsTest.cs
+++ b/src/ProtocolBuffers.Test/DescriptorsTest.cs
@@ -75,13 +75,13 @@
       Assert.AreEqual("ImportEnum", UnitTestImportProtoFile.Descriptor.EnumTypes[0].Name);
       for (int i = 0; i < file.EnumTypes.Count; i++) {
         Assert.AreEqual(i, file.EnumTypes[i].Index);
-      }
-
-      ServiceDescriptor service = TestService.Descriptor;
-      Assert.AreEqual(service, file.Services[0]);
-      Assert.AreEqual(service, file.FindTypeByName<ServiceDescriptor>("TestService"));
-      Assert.IsNull(file.FindTypeByName<ServiceDescriptor>("NoSuchType"));
-      Assert.IsNull(file.FindTypeByName<ServiceDescriptor>("protobuf_unittest.TestService"));
+      }

+

+      ServiceDescriptor service = TestGenericService.Descriptor;
+      Assert.AreEqual(service, UnitTestGenericServices.Descriptor.Services[0]);

+      Assert.AreEqual(service, UnitTestGenericServices.Descriptor.FindTypeByName<ServiceDescriptor>("TestGenericService"));

+      Assert.IsNull(UnitTestGenericServices.Descriptor.FindTypeByName<ServiceDescriptor>("NoSuchType"));

+      Assert.IsNull(UnitTestGenericServices.Descriptor.FindTypeByName<ServiceDescriptor>("protobuf_unittest.TestGenericService"));
       Assert.AreEqual(0, UnitTestImportProtoFile.Descriptor.Services.Count);
       for (int i = 0; i < file.Services.Count; i++) {
         Assert.AreEqual(i, file.Services[i].Index);
@@ -261,11 +261,11 @@
 
     [Test]
     public void ServiceDescriptor() {
-      ServiceDescriptor service = TestService.Descriptor;
-
-      Assert.AreEqual("TestService", service.Name);
-      Assert.AreEqual("protobuf_unittest.TestService", service.FullName);
-      Assert.AreEqual(UnitTestProtoFile.Descriptor, service.File);
+      ServiceDescriptor service = TestGenericService.Descriptor;

+

+      Assert.AreEqual("TestGenericService", service.Name);

+      Assert.AreEqual("protobuf_unittest.TestGenericService", service.FullName);

+      Assert.AreEqual(UnitTestGenericServices.Descriptor, service.File);
 
       Assert.AreEqual(2, service.Methods.Count);
 
@@ -310,9 +310,9 @@
         enumType.getOptions().hasExtension(UnittestCustomOptions.enumOpt1));
       Assert.AreEqual(Integer.valueOf(-789),
         enumType.getOptions().getExtension(UnittestCustomOptions.enumOpt1));
-        */
-
-      ServiceDescriptor service = TestServiceWithCustomOptions.Descriptor;
+        */

+

+      ServiceDescriptor service = TestGenericServiceWithCustomOptions.Descriptor;
 
       Assert.IsTrue(service.Options.HasExtension(UnitTestCustomOptionsProtoFile.ServiceOpt1));
       Assert.AreEqual(-9876543210L, service.Options.GetExtension(UnitTestCustomOptionsProtoFile.ServiceOpt1));
diff --git a/src/ProtocolBuffers.Test/ProtocolBuffers.Test.csproj b/src/ProtocolBuffers.Test/ProtocolBuffers.Test.csproj
index f72bcf8..83a598d 100644
--- a/src/ProtocolBuffers.Test/ProtocolBuffers.Test.csproj
+++ b/src/ProtocolBuffers.Test/ProtocolBuffers.Test.csproj
@@ -92,6 +92,7 @@
     <Compile Include="TestProtos\UnitTestCustomOptionsProtoFile.cs" />

     <Compile Include="TestProtos\UnitTestEmbedOptimizeForProtoFile.cs" />

     <Compile Include="TestProtos\UnitTestEmptyProtoFile.cs" />

+    <Compile Include="TestProtos\UnitTestGenericServices.cs" />

     <Compile Include="TestProtos\UnitTestImportLiteProtoFile.cs" />

     <Compile Include="TestProtos\UnitTestImportProtoFile.cs" />

     <Compile Include="TestProtos\UnitTestMessageSetProtoFile.cs" />

diff --git a/src/ProtocolBuffers.Test/ServiceTest.cs b/src/ProtocolBuffers.Test/ServiceTest.cs
index f6f7c74..579c458 100644
--- a/src/ProtocolBuffers.Test/ServiceTest.cs
+++ b/src/ProtocolBuffers.Test/ServiceTest.cs
@@ -50,12 +50,12 @@
 
     delegate void Action<T1, T2>(T1 t1, T2 t2);
 
-    private static readonly MethodDescriptor FooDescriptor = TestService.Descriptor.Methods[0];
-    private static readonly MethodDescriptor BarDescriptor = TestService.Descriptor.Methods[1];
+    private static readonly MethodDescriptor FooDescriptor = TestGenericService.Descriptor.Methods[0];

+    private static readonly MethodDescriptor BarDescriptor = TestGenericService.Descriptor.Methods[1];
 
     [Test]
     public void GetRequestPrototype() {
-      TestService service = new TestServiceImpl();
+      TestGenericService service = new TestServiceImpl();
 
       Assert.AreSame(service.GetRequestPrototype(FooDescriptor), FooRequest.DefaultInstance);
       Assert.AreSame(service.GetRequestPrototype(BarDescriptor), BarRequest.DefaultInstance);
@@ -63,7 +63,7 @@
 
     [Test]
     public void GetResponsePrototype() {
-      TestService service = new TestServiceImpl();
+      TestGenericService service = new TestServiceImpl();
 
       Assert.AreSame(service.GetResponsePrototype(FooDescriptor), FooResponse.DefaultInstance);
       Assert.AreSame(service.GetResponsePrototype(BarDescriptor), BarResponse.DefaultInstance);
@@ -71,14 +71,14 @@
 
     [Test]
     public void CallMethodFoo() {
-      MockRepository mocks = new MockRepository();
-      FooRequest fooRequest = FooRequest.CreateBuilder().Build();
+      MockRepository mocks = new MockRepository();

+      FooRequest fooRequest = FooRequest.CreateBuilder().Build();

       FooResponse fooResponse = FooResponse.CreateBuilder().Build();
       IRpcController controller = mocks.StrictMock<IRpcController>();
 
       bool fooCalled = false;
 
-      TestService service = new TestServiceImpl((request, responseAction) => {
+      TestGenericService service = new TestServiceImpl((request, responseAction) => {
         Assert.AreSame(fooRequest, request);
         fooCalled = true;
         responseAction(fooResponse);
@@ -115,8 +115,8 @@
       FooRequest fooRequest = FooRequest.CreateBuilder().Build();      
       MockRepository mocks = new MockRepository();
       IRpcChannel mockChannel = mocks.StrictMock<IRpcChannel>();
-      IRpcController mockController = mocks.StrictMock<IRpcController>();
-      TestService service = TestService.CreateStub(mockChannel);
+      IRpcController mockController = mocks.StrictMock<IRpcController>();

+      TestGenericService service = TestGenericService.CreateStub(mockChannel);

       Action<FooResponse> doneHandler = mocks.StrictMock<Action<FooResponse>>();
 
       using (mocks.Record()) {
@@ -126,7 +126,7 @@
             .IgnoreArguments()
             .Constraints(Is.Same(FooDescriptor), Is.Same(mockController), Is.Same(fooRequest), 
                          Is.Same(FooResponse.DefaultInstance), Is.Anything())
-            .Do((CallFooDelegate) ((p1, p2, p3, response, done) => done(response)));
+            .Do((CallFooDelegate) ((p1, p2, p3, response, done) => done(response)));

         doneHandler(FooResponse.DefaultInstance);
       }
 
@@ -137,14 +137,14 @@
 
     [Test]
     public void CallMethodBar() {
-      MockRepository mocks = new MockRepository();
-      BarRequest barRequest = BarRequest.CreateBuilder().Build();
+      MockRepository mocks = new MockRepository();

+      BarRequest barRequest = BarRequest.CreateBuilder().Build();

       BarResponse barResponse = BarResponse.CreateBuilder().Build();
       IRpcController controller = mocks.StrictMock<IRpcController>();
 
       bool barCalled = false;
 
-      TestService service = new TestServiceImpl(null, (request, responseAction) => {
+      TestGenericService service = new TestServiceImpl(null, (request, responseAction) => {
         Assert.AreSame(barRequest, request);
         barCalled = true;
         responseAction(barResponse);
@@ -168,15 +168,15 @@
     }
     
     
-    class TestServiceImpl : TestService {
+    class TestServiceImpl : TestGenericService {
       private readonly Action<FooRequest, Action<FooResponse>> fooHandler;
       private readonly Action<BarRequest, Action<BarResponse>> barHandler;
       private readonly IRpcController expectedController;
 
       internal TestServiceImpl() {
-      }
-
-      internal TestServiceImpl(Action<FooRequest, Action<FooResponse>> fooHandler,
+      }

+

+      internal TestServiceImpl(Action<FooRequest, Action<FooResponse>> fooHandler,

           Action<BarRequest, Action<BarResponse>> barHandler,
           IRpcController expectedController) {
         this.fooHandler = fooHandler;
diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestCustomOptionsProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestCustomOptionsProtoFile.cs
index 1d2039c..4fca38d 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestCustomOptionsProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestCustomOptionsProtoFile.cs
@@ -3957,90 +3957,10 @@
   #endregion

   

   #region Services

-  public abstract class TestServiceWithCustomOptions : pb::IService {

-    public abstract void Foo(

-        pb::IRpcController controller,

-        global::Google.ProtocolBuffers.TestProtos.CustomOptionFooRequest request,

-        global::System.Action<global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse> done);

-    

-    public static pbd::ServiceDescriptor Descriptor {

-      get { return UnitTestCustomOptionsProtoFile.Descriptor.Services[0]; }

-    }

-    public pbd::ServiceDescriptor DescriptorForType {

-      get { return Descriptor; }

-    }

-    

-    public void CallMethod(

-        pbd::MethodDescriptor method,

-        pb::IRpcController controller,

-        pb::IMessage request,

-        global::System.Action<pb::IMessage> done) {

-      if (method.Service != Descriptor) {

-        throw new global::System.ArgumentException(

-            "Service.CallMethod() given method descriptor for wrong service type.");

-      }

-      switch(method.Index) {

-        case 0:

-          this.Foo(controller, (global::Google.ProtocolBuffers.TestProtos.CustomOptionFooRequest) request,

-              pb::RpcUtil.SpecializeCallback<global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse>(

-              done));

-          return;

-        default:

-          throw new global::System.InvalidOperationException("Can't get here.");

-      }

-    }

-    

-    public pb::IMessage GetRequestPrototype(pbd::MethodDescriptor method) {

-      if (method.Service != Descriptor) {

-        throw new global::System.ArgumentException(

-            "Service.GetRequestPrototype() given method descriptor for wrong service type.");

-      }

-      switch(method.Index) {

-        case 0:

-          return global::Google.ProtocolBuffers.TestProtos.CustomOptionFooRequest.DefaultInstance;

-        default:

-          throw new global::System.InvalidOperationException("Can't get here.");

-      }

-    }

-    

-    public pb::IMessage GetResponsePrototype(pbd::MethodDescriptor method) {

-      if (method.Service != Descriptor) {

-        throw new global::System.ArgumentException(

-            "Service.GetResponsePrototype() given method descriptor for wrong service type.");

-      }

-      switch(method.Index) {

-        case 0:

-          return global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse.DefaultInstance;

-        default:

-          throw new global::System.InvalidOperationException("Can't get here.");

-      }

-    }

-    

-    public static Stub CreateStub(pb::IRpcChannel channel) {

-      return new Stub(channel);

-    }

-    

-    public class Stub : global::Google.ProtocolBuffers.TestProtos.TestServiceWithCustomOptions {

-      internal Stub(pb::IRpcChannel channel) {

-        this.channel = channel;

-      }

-      

-      private readonly pb::IRpcChannel channel;

-      

-      public pb::IRpcChannel Channel {

-        get { return channel; }

-      }

-      

-      public override void Foo(

-          pb::IRpcController controller,

-          global::Google.ProtocolBuffers.TestProtos.CustomOptionFooRequest request,

-          global::System.Action<global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse> done) {

-        channel.CallMethod(Descriptor.Methods[0],

-            controller, request, global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse.DefaultInstance,

-            pb::RpcUtil.GeneralizeCallback<global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse, global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse.Builder>(done, global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse.DefaultInstance));

-      }

-    }

-  }

+  /*

+  * Service generation is now disabled by default, use the following option to enable:

+  * option (google.protobuf.csharp_file_options).service_generator_type = GENERIC;

+  */

   #endregion

   

 }

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestGenericServices.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestGenericServices.cs
new file mode 100644
index 0000000..51f16d2
--- /dev/null
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestGenericServices.cs
@@ -0,0 +1,250 @@
+// Generated by ProtoGen, Version=0.9.0.0, Culture=neutral, PublicKeyToken=8fd7408b07f8d2cd.  DO NOT EDIT!

+

+using pb = global::Google.ProtocolBuffers;

+using pbc = global::Google.ProtocolBuffers.Collections;

+using pbd = global::Google.ProtocolBuffers.Descriptors;

+using scg = global::System.Collections.Generic;

+namespace Google.ProtocolBuffers.TestProtos {

+  

+  public static partial class UnitTestGenericServices {

+  

+    #region Extension registration

+    public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {

+    }

+    #endregion

+    #region Static variables

+    #endregion

+    #region Descriptor

+    public static pbd::FileDescriptor Descriptor {

+      get { return descriptor; }

+    }

+    private static pbd::FileDescriptor descriptor;

+    

+    static UnitTestGenericServices() {

+      byte[] descriptorData = global::System.Convert.FromBase64String(

+          "CiZleHRlc3QvdW5pdHRlc3RfZ2VuZXJpY19zZXJ2aWNlcy5wcm90bxIRcHJv" + 

+          "dG9idWZfdW5pdHRlc3QaJGdvb2dsZS9wcm90b2J1Zi9jc2hhcnBfb3B0aW9u" + 

+          "cy5wcm90bxoeZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvGi1nb29n" + 

+          "bGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8yoAEK" + 

+          "ElRlc3RHZW5lcmljU2VydmljZRJECgNGb28SHS5wcm90b2J1Zl91bml0dGVz" + 

+          "dC5Gb29SZXF1ZXN0Gh4ucHJvdG9idWZfdW5pdHRlc3QuRm9vUmVzcG9uc2US" + 

+          "RAoDQmFyEh0ucHJvdG9idWZfdW5pdHRlc3QuQmFyUmVxdWVzdBoeLnByb3Rv" + 

+          "YnVmX3VuaXR0ZXN0LkJhclJlc3BvbnNlMpUBCiNUZXN0R2VuZXJpY1NlcnZp" + 

+          "Y2VXaXRoQ3VzdG9tT3B0aW9ucxJjCgNGb28SKS5wcm90b2J1Zl91bml0dGVz" + 

+          "dC5DdXN0b21PcHRpb25Gb29SZXF1ZXN0GioucHJvdG9idWZfdW5pdHRlc3Qu" + 

+          "Q3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UiBeD6jB4CGgmQsose09uAy0lCREgB" + 

+          "wj4/CiFHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MSF1VuaXRU" + 

+          "ZXN0R2VuZXJpY1NlcnZpY2VziA4B");

+      pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {

+        descriptor = root;

+        pb::ExtensionRegistry registry = pb::ExtensionRegistry.CreateInstance();

+        RegisterAllExtensions(registry);

+        global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.RegisterAllExtensions(registry);

+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RegisterAllExtensions(registry);

+        global::Google.ProtocolBuffers.TestProtos.UnitTestCustomOptionsProtoFile.RegisterAllExtensions(registry);

+        return registry;

+      };

+      pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,

+          new pbd::FileDescriptor[] {

+          global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.Descriptor, 

+          global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, 

+          global::Google.ProtocolBuffers.TestProtos.UnitTestCustomOptionsProtoFile.Descriptor, 

+          }, assigner);

+    }

+    #endregion

+    

+  }

+  #region Services

+  public abstract class TestGenericService : pb::IService {

+    public abstract void Foo(

+        pb::IRpcController controller,

+        global::Google.ProtocolBuffers.TestProtos.FooRequest request,

+        global::System.Action<global::Google.ProtocolBuffers.TestProtos.FooResponse> done);

+    public abstract void Bar(

+        pb::IRpcController controller,

+        global::Google.ProtocolBuffers.TestProtos.BarRequest request,

+        global::System.Action<global::Google.ProtocolBuffers.TestProtos.BarResponse> done);

+    

+    public static pbd::ServiceDescriptor Descriptor {

+      get { return UnitTestGenericServices.Descriptor.Services[0]; }

+    }

+    public pbd::ServiceDescriptor DescriptorForType {

+      get { return Descriptor; }

+    }

+    

+    public void CallMethod(

+        pbd::MethodDescriptor method,

+        pb::IRpcController controller,

+        pb::IMessage request,

+        global::System.Action<pb::IMessage> done) {

+      if (method.Service != Descriptor) {

+        throw new global::System.ArgumentException(

+            "Service.CallMethod() given method descriptor for wrong service type.");

+      }

+      switch(method.Index) {

+        case 0:

+          this.Foo(controller, (global::Google.ProtocolBuffers.TestProtos.FooRequest) request,

+              pb::RpcUtil.SpecializeCallback<global::Google.ProtocolBuffers.TestProtos.FooResponse>(

+              done));

+          return;

+        case 1:

+          this.Bar(controller, (global::Google.ProtocolBuffers.TestProtos.BarRequest) request,

+              pb::RpcUtil.SpecializeCallback<global::Google.ProtocolBuffers.TestProtos.BarResponse>(

+              done));

+          return;

+        default:

+          throw new global::System.InvalidOperationException("Can't get here.");

+      }

+    }

+    

+    public pb::IMessage GetRequestPrototype(pbd::MethodDescriptor method) {

+      if (method.Service != Descriptor) {

+        throw new global::System.ArgumentException(

+            "Service.GetRequestPrototype() given method descriptor for wrong service type.");

+      }

+      switch(method.Index) {

+        case 0:

+          return global::Google.ProtocolBuffers.TestProtos.FooRequest.DefaultInstance;

+        case 1:

+          return global::Google.ProtocolBuffers.TestProtos.BarRequest.DefaultInstance;

+        default:

+          throw new global::System.InvalidOperationException("Can't get here.");

+      }

+    }

+    

+    public pb::IMessage GetResponsePrototype(pbd::MethodDescriptor method) {

+      if (method.Service != Descriptor) {

+        throw new global::System.ArgumentException(

+            "Service.GetResponsePrototype() given method descriptor for wrong service type.");

+      }

+      switch(method.Index) {

+        case 0:

+          return global::Google.ProtocolBuffers.TestProtos.FooResponse.DefaultInstance;

+        case 1:

+          return global::Google.ProtocolBuffers.TestProtos.BarResponse.DefaultInstance;

+        default:

+          throw new global::System.InvalidOperationException("Can't get here.");

+      }

+    }

+    

+    public static Stub CreateStub(pb::IRpcChannel channel) {

+      return new Stub(channel);

+    }

+    

+    public class Stub : global::Google.ProtocolBuffers.TestProtos.TestGenericService {

+      internal Stub(pb::IRpcChannel channel) {

+        this.channel = channel;

+      }

+      

+      private readonly pb::IRpcChannel channel;

+      

+      public pb::IRpcChannel Channel {

+        get { return channel; }

+      }

+      

+      public override void Foo(

+          pb::IRpcController controller,

+          global::Google.ProtocolBuffers.TestProtos.FooRequest request,

+          global::System.Action<global::Google.ProtocolBuffers.TestProtos.FooResponse> done) {

+        channel.CallMethod(Descriptor.Methods[0],

+            controller, request, global::Google.ProtocolBuffers.TestProtos.FooResponse.DefaultInstance,

+            pb::RpcUtil.GeneralizeCallback<global::Google.ProtocolBuffers.TestProtos.FooResponse, global::Google.ProtocolBuffers.TestProtos.FooResponse.Builder>(done, global::Google.ProtocolBuffers.TestProtos.FooResponse.DefaultInstance));

+      }

+      

+      public override void Bar(

+          pb::IRpcController controller,

+          global::Google.ProtocolBuffers.TestProtos.BarRequest request,

+          global::System.Action<global::Google.ProtocolBuffers.TestProtos.BarResponse> done) {

+        channel.CallMethod(Descriptor.Methods[1],

+            controller, request, global::Google.ProtocolBuffers.TestProtos.BarResponse.DefaultInstance,

+            pb::RpcUtil.GeneralizeCallback<global::Google.ProtocolBuffers.TestProtos.BarResponse, global::Google.ProtocolBuffers.TestProtos.BarResponse.Builder>(done, global::Google.ProtocolBuffers.TestProtos.BarResponse.DefaultInstance));

+      }

+    }

+  }

+  public abstract class TestGenericServiceWithCustomOptions : pb::IService {

+    public abstract void Foo(

+        pb::IRpcController controller,

+        global::Google.ProtocolBuffers.TestProtos.CustomOptionFooRequest request,

+        global::System.Action<global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse> done);

+    

+    public static pbd::ServiceDescriptor Descriptor {

+      get { return UnitTestGenericServices.Descriptor.Services[1]; }

+    }

+    public pbd::ServiceDescriptor DescriptorForType {

+      get { return Descriptor; }

+    }

+    

+    public void CallMethod(

+        pbd::MethodDescriptor method,

+        pb::IRpcController controller,

+        pb::IMessage request,

+        global::System.Action<pb::IMessage> done) {

+      if (method.Service != Descriptor) {

+        throw new global::System.ArgumentException(

+            "Service.CallMethod() given method descriptor for wrong service type.");

+      }

+      switch(method.Index) {

+        case 0:

+          this.Foo(controller, (global::Google.ProtocolBuffers.TestProtos.CustomOptionFooRequest) request,

+              pb::RpcUtil.SpecializeCallback<global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse>(

+              done));

+          return;

+        default:

+          throw new global::System.InvalidOperationException("Can't get here.");

+      }

+    }

+    

+    public pb::IMessage GetRequestPrototype(pbd::MethodDescriptor method) {

+      if (method.Service != Descriptor) {

+        throw new global::System.ArgumentException(

+            "Service.GetRequestPrototype() given method descriptor for wrong service type.");

+      }

+      switch(method.Index) {

+        case 0:

+          return global::Google.ProtocolBuffers.TestProtos.CustomOptionFooRequest.DefaultInstance;

+        default:

+          throw new global::System.InvalidOperationException("Can't get here.");

+      }

+    }

+    

+    public pb::IMessage GetResponsePrototype(pbd::MethodDescriptor method) {

+      if (method.Service != Descriptor) {

+        throw new global::System.ArgumentException(

+            "Service.GetResponsePrototype() given method descriptor for wrong service type.");

+      }

+      switch(method.Index) {

+        case 0:

+          return global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse.DefaultInstance;

+        default:

+          throw new global::System.InvalidOperationException("Can't get here.");

+      }

+    }

+    

+    public static Stub CreateStub(pb::IRpcChannel channel) {

+      return new Stub(channel);

+    }

+    

+    public class Stub : global::Google.ProtocolBuffers.TestProtos.TestGenericServiceWithCustomOptions {

+      internal Stub(pb::IRpcChannel channel) {

+        this.channel = channel;

+      }

+      

+      private readonly pb::IRpcChannel channel;

+      

+      public pb::IRpcChannel Channel {

+        get { return channel; }

+      }

+      

+      public override void Foo(

+          pb::IRpcController controller,

+          global::Google.ProtocolBuffers.TestProtos.CustomOptionFooRequest request,

+          global::System.Action<global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse> done) {

+        channel.CallMethod(Descriptor.Methods[0],

+            controller, request, global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse.DefaultInstance,

+            pb::RpcUtil.GeneralizeCallback<global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse, global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse.Builder>(done, global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse.DefaultInstance));

+      }

+    }

+  }

+  #endregion

+  

+}

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestNoGenericServicesProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestNoGenericServicesProtoFile.cs
index bf77ccb..8d7c97a 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestNoGenericServicesProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestNoGenericServicesProtoFile.cs
@@ -293,90 +293,10 @@
   #endregion

   

   #region Services

-  public abstract class TestService : pb::IService {

-    public abstract void Foo(

-        pb::IRpcController controller,

-        global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage request,

-        global::System.Action<global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage> done);

-    

-    public static pbd::ServiceDescriptor Descriptor {

-      get { return UnitTestNoGenericServicesProtoFile.Descriptor.Services[0]; }

-    }

-    public pbd::ServiceDescriptor DescriptorForType {

-      get { return Descriptor; }

-    }

-    

-    public void CallMethod(

-        pbd::MethodDescriptor method,

-        pb::IRpcController controller,

-        pb::IMessage request,

-        global::System.Action<pb::IMessage> done) {

-      if (method.Service != Descriptor) {

-        throw new global::System.ArgumentException(

-            "Service.CallMethod() given method descriptor for wrong service type.");

-      }

-      switch(method.Index) {

-        case 0:

-          this.Foo(controller, (global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage) request,

-              pb::RpcUtil.SpecializeCallback<global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage>(

-              done));

-          return;

-        default:

-          throw new global::System.InvalidOperationException("Can't get here.");

-      }

-    }

-    

-    public pb::IMessage GetRequestPrototype(pbd::MethodDescriptor method) {

-      if (method.Service != Descriptor) {

-        throw new global::System.ArgumentException(

-            "Service.GetRequestPrototype() given method descriptor for wrong service type.");

-      }

-      switch(method.Index) {

-        case 0:

-          return global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage.DefaultInstance;

-        default:

-          throw new global::System.InvalidOperationException("Can't get here.");

-      }

-    }

-    

-    public pb::IMessage GetResponsePrototype(pbd::MethodDescriptor method) {

-      if (method.Service != Descriptor) {

-        throw new global::System.ArgumentException(

-            "Service.GetResponsePrototype() given method descriptor for wrong service type.");

-      }

-      switch(method.Index) {

-        case 0:

-          return global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage.DefaultInstance;

-        default:

-          throw new global::System.InvalidOperationException("Can't get here.");

-      }

-    }

-    

-    public static Stub CreateStub(pb::IRpcChannel channel) {

-      return new Stub(channel);

-    }

-    

-    public class Stub : global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestService {

-      internal Stub(pb::IRpcChannel channel) {

-        this.channel = channel;

-      }

-      

-      private readonly pb::IRpcChannel channel;

-      

-      public pb::IRpcChannel Channel {

-        get { return channel; }

-      }

-      

-      public override void Foo(

-          pb::IRpcController controller,

-          global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage request,

-          global::System.Action<global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage> done) {

-        channel.CallMethod(Descriptor.Methods[0],

-            controller, request, global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage.DefaultInstance,

-            pb::RpcUtil.GeneralizeCallback<global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage, global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage.Builder>(done, global::Google.ProtocolBuffers.TestProtos.NoGenericService.TestMessage.DefaultInstance));

-      }

-    }

-  }

+  /*

+  * Service generation is now disabled by default, use the following option to enable:

+  * option (google.protobuf.csharp_file_options).service_generator_type = GENERIC;

+  */

   #endregion

   

 }

diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs
index 2d86a64..a02255d 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs
@@ -18512,112 +18512,10 @@
   #endregion

   

   #region Services

-  public abstract class TestService : pb::IService {

-    public abstract void Foo(

-        pb::IRpcController controller,

-        global::Google.ProtocolBuffers.TestProtos.FooRequest request,

-        global::System.Action<global::Google.ProtocolBuffers.TestProtos.FooResponse> done);

-    public abstract void Bar(

-        pb::IRpcController controller,

-        global::Google.ProtocolBuffers.TestProtos.BarRequest request,

-        global::System.Action<global::Google.ProtocolBuffers.TestProtos.BarResponse> done);

-    

-    public static pbd::ServiceDescriptor Descriptor {

-      get { return UnitTestProtoFile.Descriptor.Services[0]; }

-    }

-    public pbd::ServiceDescriptor DescriptorForType {

-      get { return Descriptor; }

-    }

-    

-    public void CallMethod(

-        pbd::MethodDescriptor method,

-        pb::IRpcController controller,

-        pb::IMessage request,

-        global::System.Action<pb::IMessage> done) {

-      if (method.Service != Descriptor) {

-        throw new global::System.ArgumentException(

-            "Service.CallMethod() given method descriptor for wrong service type.");

-      }

-      switch(method.Index) {

-        case 0:

-          this.Foo(controller, (global::Google.ProtocolBuffers.TestProtos.FooRequest) request,

-              pb::RpcUtil.SpecializeCallback<global::Google.ProtocolBuffers.TestProtos.FooResponse>(

-              done));

-          return;

-        case 1:

-          this.Bar(controller, (global::Google.ProtocolBuffers.TestProtos.BarRequest) request,

-              pb::RpcUtil.SpecializeCallback<global::Google.ProtocolBuffers.TestProtos.BarResponse>(

-              done));

-          return;

-        default:

-          throw new global::System.InvalidOperationException("Can't get here.");

-      }

-    }

-    

-    public pb::IMessage GetRequestPrototype(pbd::MethodDescriptor method) {

-      if (method.Service != Descriptor) {

-        throw new global::System.ArgumentException(

-            "Service.GetRequestPrototype() given method descriptor for wrong service type.");

-      }

-      switch(method.Index) {

-        case 0:

-          return global::Google.ProtocolBuffers.TestProtos.FooRequest.DefaultInstance;

-        case 1:

-          return global::Google.ProtocolBuffers.TestProtos.BarRequest.DefaultInstance;

-        default:

-          throw new global::System.InvalidOperationException("Can't get here.");

-      }

-    }

-    

-    public pb::IMessage GetResponsePrototype(pbd::MethodDescriptor method) {

-      if (method.Service != Descriptor) {

-        throw new global::System.ArgumentException(

-            "Service.GetResponsePrototype() given method descriptor for wrong service type.");

-      }

-      switch(method.Index) {

-        case 0:

-          return global::Google.ProtocolBuffers.TestProtos.FooResponse.DefaultInstance;

-        case 1:

-          return global::Google.ProtocolBuffers.TestProtos.BarResponse.DefaultInstance;

-        default:

-          throw new global::System.InvalidOperationException("Can't get here.");

-      }

-    }

-    

-    public static Stub CreateStub(pb::IRpcChannel channel) {

-      return new Stub(channel);

-    }

-    

-    public class Stub : global::Google.ProtocolBuffers.TestProtos.TestService {

-      internal Stub(pb::IRpcChannel channel) {

-        this.channel = channel;

-      }

-      

-      private readonly pb::IRpcChannel channel;

-      

-      public pb::IRpcChannel Channel {

-        get { return channel; }

-      }

-      

-      public override void Foo(

-          pb::IRpcController controller,

-          global::Google.ProtocolBuffers.TestProtos.FooRequest request,

-          global::System.Action<global::Google.ProtocolBuffers.TestProtos.FooResponse> done) {

-        channel.CallMethod(Descriptor.Methods[0],

-            controller, request, global::Google.ProtocolBuffers.TestProtos.FooResponse.DefaultInstance,

-            pb::RpcUtil.GeneralizeCallback<global::Google.ProtocolBuffers.TestProtos.FooResponse, global::Google.ProtocolBuffers.TestProtos.FooResponse.Builder>(done, global::Google.ProtocolBuffers.TestProtos.FooResponse.DefaultInstance));

-      }

-      

-      public override void Bar(

-          pb::IRpcController controller,

-          global::Google.ProtocolBuffers.TestProtos.BarRequest request,

-          global::System.Action<global::Google.ProtocolBuffers.TestProtos.BarResponse> done) {

-        channel.CallMethod(Descriptor.Methods[1],

-            controller, request, global::Google.ProtocolBuffers.TestProtos.BarResponse.DefaultInstance,

-            pb::RpcUtil.GeneralizeCallback<global::Google.ProtocolBuffers.TestProtos.BarResponse, global::Google.ProtocolBuffers.TestProtos.BarResponse.Builder>(done, global::Google.ProtocolBuffers.TestProtos.BarResponse.DefaultInstance));

-      }

-    }

-  }

+  /*

+  * Service generation is now disabled by default, use the following option to enable:

+  * option (google.protobuf.csharp_file_options).service_generator_type = GENERIC;

+  */

   #endregion

   

 }