You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by je...@apache.org on 2020/02/28 18:21:36 UTC

[thrift] 01/02: THRIFT-4982 Remove deprecated C# bindings from the code base Client: csharp Patch: Jens Geyer

This is an automated email from the ASF dual-hosted git repository.

jensg pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/thrift.git

commit 56700e469d5d0659994a3963ad5a111740cf8277
Author: Jens Geyer <je...@apache.org>
AuthorDate: Sat Feb 22 16:51:51 2020 +0100

    THRIFT-4982 Remove deprecated C# bindings from the code base
    Client: csharp
    Patch: Jens Geyer
    
    This closes #2027
---
 .gitignore                                         |   17 -
 ApacheThrift.nuspec                                |   11 +-
 CHANGES.md                                         |    1 +
 LANGUAGES.md                                       |   22 -
 Makefile.am                                        |    2 +-
 build/docker/old/debian-jessie/Dockerfile          |    5 -
 build/docker/old/debian-stretch/Dockerfile         |    4 -
 build/docker/old/ubuntu-artful/Dockerfile          |    8 -
 build/docker/old/ubuntu-trusty/Dockerfile          |    4 -
 build/docker/ubuntu-bionic/Dockerfile              |    4 -
 build/docker/ubuntu-disco/Dockerfile               |    4 -
 build/docker/ubuntu-xenial/Dockerfile              |    8 -
 build/veralign.sh                                  |   36 +-
 compiler/cpp/CMakeLists.txt                        |    1 -
 compiler/cpp/Makefile.am                           |    1 -
 compiler/cpp/compiler.vcxproj                      |    1 -
 compiler/cpp/compiler.vcxproj.filters              |    3 -
 .../cpp/src/thrift/generate/t_csharp_generator.cc  | 3261 --------------------
 .../cpp/src/thrift/generate/t_netstd_generator.cc  |    5 -
 compiler/cpp/src/thrift/parse/t_program.h          |    2 +-
 compiler/cpp/src/thrift/thriftl.ll                 |    1 -
 compiler/cpp/tests/CMakeLists.txt                  |    1 -
 configure.ac                                       |   31 -
 contrib/Rebus/README.md                            |    5 +
 contrib/Vagrantfile                                |    4 -
 contrib/thrift.spec                                |    1 -
 contrib/zeromq/README.md                           |    5 +
 debian/control                                     |   15 +-
 debian/copyright                                   |   62 +-
 debian/rules                                       |    8 +-
 doc/install/debian.md                              |    4 +-
 doc/specs/idl.md                                   |    2 +-
 lib/Makefile.am                                    |    4 -
 lib/cpp/test/OneWayTest.thrift                     |    1 -
 lib/csharp/Makefile.am                             |  114 -
 lib/csharp/README.md                               |   32 -
 .../ThriftMSBuildTask/Properties/AssemblyInfo.cs   |   60 -
 lib/csharp/ThriftMSBuildTask/ThriftBuild.cs        |  246 --
 .../ThriftMSBuildTask/ThriftMSBuildTask.csproj     |  118 -
 lib/csharp/coding_standards.md                     |    6 -
 lib/csharp/src/Collections/TCollections.cs         |   94 -
 lib/csharp/src/Collections/THashSet.cs             |  160 -
 lib/csharp/src/Net35/ExtensionsNet35.cs            |   31 -
 lib/csharp/src/Properties/AssemblyInfo.cs          |   55 -
 lib/csharp/src/Protocol/TAbstractBase.cs           |   29 -
 lib/csharp/src/Protocol/TBase.cs                   |   29 -
 lib/csharp/src/Protocol/TBase64Utils.cs            |  100 -
 lib/csharp/src/Protocol/TBinaryProtocol.cs         |  395 ---
 lib/csharp/src/Protocol/TCompactProtocol.cs        |  849 -----
 lib/csharp/src/Protocol/TField.cs                  |   62 -
 lib/csharp/src/Protocol/TJSONProtocol.cs           | 1124 -------
 lib/csharp/src/Protocol/TList.cs                   |   54 -
 lib/csharp/src/Protocol/TMap.cs                    |   62 -
 lib/csharp/src/Protocol/TMessage.cs                |   62 -
 lib/csharp/src/Protocol/TMessageType.cs            |   31 -
 lib/csharp/src/Protocol/TMultiplexedProcessor.cs   |  183 --
 lib/csharp/src/Protocol/TMultiplexedProtocol.cs    |  103 -
 lib/csharp/src/Protocol/TProtocol.cs               |  142 -
 lib/csharp/src/Protocol/TProtocolDecorator.cs      |  261 --
 lib/csharp/src/Protocol/TProtocolException.cs      |   67 -
 lib/csharp/src/Protocol/TProtocolFactory.cs        |   33 -
 lib/csharp/src/Protocol/TProtocolUtil.cs           |  108 -
 lib/csharp/src/Protocol/TSet.cs                    |   59 -
 lib/csharp/src/Protocol/TStruct.cs                 |   46 -
 lib/csharp/src/Protocol/TType.cs                   |   44 -
 lib/csharp/src/Server/TServer.cs                   |  155 -
 lib/csharp/src/Server/TServerEventHandler.cs       |   53 -
 lib/csharp/src/Server/TSimpleServer.cs             |  180 --
 lib/csharp/src/Server/TThreadPoolServer.cs         |  295 --
 lib/csharp/src/Server/TThreadedServer.cs           |  282 --
 lib/csharp/src/TApplicationException.cs            |  146 -
 lib/csharp/src/TAsyncProcessor.cs                  |   38 -
 lib/csharp/src/TControllingHandler.cs              |   29 -
 lib/csharp/src/TException.cs                       |   40 -
 lib/csharp/src/TProcessor.cs                       |   33 -
 lib/csharp/src/TProcessorFactory.cs                |   30 -
 lib/csharp/src/TPrototypeProcessorFactory.cs       |   55 -
 lib/csharp/src/TSingletonProcessorFactory.cs       |   43 -
 lib/csharp/src/Thrift.45.csproj                    |  138 -
 lib/csharp/src/Thrift.csproj                       |  166 -
 lib/csharp/src/Thrift.sln                          |   47 -
 lib/csharp/src/Transport/TBufferedTransport.cs     |  194 --
 lib/csharp/src/Transport/TFramedTransport.cs       |  205 --
 lib/csharp/src/Transport/THttpClient.cs            |  486 ---
 lib/csharp/src/Transport/THttpHandler.cs           |  102 -
 lib/csharp/src/Transport/THttpTaskAsyncHandler.cs  |   97 -
 lib/csharp/src/Transport/TMemoryBuffer.cs          |  117 -
 .../src/Transport/TNamedPipeClientTransport.cs     |  111 -
 .../src/Transport/TNamedPipeServerTransport.cs     |  296 --
 lib/csharp/src/Transport/TServerSocket.cs          |  176 --
 lib/csharp/src/Transport/TServerTransport.cs       |   44 -
 lib/csharp/src/Transport/TSilverlightSocket.cs     |  393 ---
 lib/csharp/src/Transport/TSocket.cs                |  245 --
 lib/csharp/src/Transport/TSocketVersionizer.cs     |   78 -
 lib/csharp/src/Transport/TStreamTransport.cs       |  128 -
 lib/csharp/src/Transport/TTLSServerSocket.cs       |  223 --
 lib/csharp/src/Transport/TTLSSocket.cs             |  445 ---
 lib/csharp/src/Transport/TTransport.cs             |  146 -
 lib/csharp/src/Transport/TTransportException.cs    |   69 -
 lib/csharp/src/Transport/TTransportFactory.cs      |   42 -
 lib/csharp/src/thrift.snk                          |  Bin 596 -> 0 bytes
 lib/csharp/test/JSON/JSONTest.csproj               |   85 -
 lib/csharp/test/JSON/Program.cs                    |   95 -
 lib/csharp/test/JSON/Properties/AssemblyInfo.cs    |   55 -
 lib/csharp/test/JSON/app.config                    |   21 -
 .../test/Multiplex/Client/Multiplex.Test.Client.cs |   82 -
 .../test/Multiplex/Client/MultiplexClient.csproj   |  148 -
 .../Multiplex/Client/Properties/AssemblyInfo.cs    |   55 -
 lib/csharp/test/Multiplex/Makefile.am              |   63 -
 lib/csharp/test/Multiplex/Multiplex.Test.Common.cs |   40 -
 .../test/Multiplex/Server/Multiplex.Test.Server.cs |  107 -
 .../test/Multiplex/Server/MultiplexServer.csproj   |  148 -
 .../Multiplex/Server/Properties/AssemblyInfo.cs    |   55 -
 .../test/ThriftMVCTest/App_Start/FilterConfig.cs   |   31 -
 .../test/ThriftMVCTest/App_Start/RouteConfig.cs    |   39 -
 lib/csharp/test/ThriftMVCTest/AsyncHttpHandler.cs  |   32 -
 .../ThriftMVCTest/Controllers/HomeController.cs    |   70 -
 lib/csharp/test/ThriftMVCTest/Global.asax          |   19 -
 lib/csharp/test/ThriftMVCTest/Global.asax.cs       |   34 -
 .../test/ThriftMVCTest/Properties/AssemblyInfo.cs  |   53 -
 lib/csharp/test/ThriftMVCTest/SecondServiceImpl.cs |   37 -
 lib/csharp/test/ThriftMVCTest/SyncHttpHandler.cs   |   32 -
 lib/csharp/test/ThriftMVCTest/ThriftMVCTest.csproj |  200 --
 .../test/ThriftMVCTest/Views/Home/Index.cshtml     |   25 -
 .../test/ThriftMVCTest/Views/Shared/_Layout.cshtml |   30 -
 lib/csharp/test/ThriftMVCTest/Views/Web.config     |   60 -
 .../test/ThriftMVCTest/Views/_ViewStart.cshtml     |   22 -
 lib/csharp/test/ThriftMVCTest/Web.Debug.config     |   45 -
 lib/csharp/test/ThriftMVCTest/Web.Release.config   |   46 -
 lib/csharp/test/ThriftMVCTest/Web.config           |   92 -
 lib/csharp/test/ThriftMVCTest/favicon.ico          |  Bin 32038 -> 0 bytes
 lib/csharp/test/ThriftMVCTest/packages.config      |   25 -
 lib/netstd/Makefile.am                             |    2 +-
 test/Makefile.am                                   |    5 -
 test/README.md                                     |    2 +-
 test/ThriftTest.thrift                             |    1 -
 test/csharp/Makefile.am                            |   95 -
 test/csharp/Program.cs                             |   71 -
 test/csharp/Properties/AssemblyInfo.cs             |   55 -
 test/csharp/TestClient.cs                          |  870 ------
 test/csharp/TestServer.cs                          |  535 ----
 test/csharp/ThriftTest.csproj                      |  141 -
 test/csharp/ThriftTest.sln                         |   17 -
 test/features/known_failures_Linux.json            |   12 +-
 test/known_failures_Linux.json                     |  186 +-
 test/netstd/Client/Program.cs                      |   15 +-
 test/netstd/Makefile.am                            |    4 +-
 test/netstd/Server/Program.cs                      |   15 +-
 test/tests.json                                    |   45 +-
 tutorial/Makefile.am                               |    1 -
 tutorial/csharp/CsharpClient/CsharpClient.cs       |   92 -
 tutorial/csharp/CsharpClient/CsharpClient.csproj   |  110 -
 .../csharp/CsharpClient/Properties/AssemblyInfo.cs |   55 -
 tutorial/csharp/CsharpServer/CsharpServer.cs       |  129 -
 tutorial/csharp/CsharpServer/CsharpServer.csproj   |  111 -
 .../csharp/CsharpServer/Properties/AssemblyInfo.cs |   55 -
 tutorial/csharp/tutorial.sln                       |   39 -
 tutorial/netstd/Makefile.am                        |    2 +-
 158 files changed, 269 insertions(+), 17872 deletions(-)

diff --git a/.gitignore b/.gitignore
index 4e2f427..58e2582 100644
--- a/.gitignore
+++ b/.gitignore
@@ -184,9 +184,6 @@ project.lock.json
 /lib/c_glib/test/testserialization
 /lib/c_glib/thriftc.pc
 /lib/c_glib/thrift_c_glib.pc
-/lib/csharp/**/bin/
-/lib/csharp/**/obj/
-/lib/csharp/src/packages
 /lib/d/test/*.pem
 /lib/d/libthriftd*.a
 /lib/d/test/async_test
@@ -234,8 +231,6 @@ project.lock.json
 /lib/js/dist
 /lib/js/doc
 /lib/js/test/build
-/lib/netcore/**/bin
-/lib/netcore/**/obj
 /lib/netstd/**/bin
 /lib/netstd/**/obj
 /lib/nodejs/coverage
@@ -313,8 +308,6 @@ project.lock.json
 /test/cpp/StressTestNonBlocking
 /test/cpp/TestClient
 /test/cpp/TestServer
-/test/csharp/obj
-/test/csharp/bin
 /test/dart/**/.dart_tool
 /test/dart/**/.packages
 /test/dart/**/packages
@@ -343,9 +336,6 @@ project.lock.json
 /test/php/php_ext_dir/
 /test/py.twisted/_trial_temp/
 /test/rb/Gemfile.lock
-/test/netcore/**/bin
-/test/netcore/**/obj
-/test/netcore/Thrift
 /test/netstd/**/bin
 /test/netstd/**/obj
 /test/netstd/*.psess
@@ -375,10 +365,6 @@ project.lock.json
 /tutorial/cpp/TutorialServer
 /tutorial/c_glib/tutorial_client
 /tutorial/c_glib/tutorial_server
-/tutorial/csharp/CsharpServer/obj
-/tutorial/csharp/CsharpServer/bin
-/tutorial/csharp/CsharpClient/obj
-/tutorial/csharp/CsharpClient/bin
 /tutorial/d/async_client
 /tutorial/d/client
 /tutorial/d/server
@@ -403,9 +389,6 @@ project.lock.json
 /tutorial/hs/dist/
 /tutorial/java/build/
 /tutorial/js/build/
-/tutorial/netcore/**/bin
-/tutorial/netcore/**/obj
-/tutorial/netcore/Thrift
 /tutorial/netstd/**/bin
 /tutorial/netstd/**/obj
 /tutorial/netstd/Interfaces
diff --git a/ApacheThrift.nuspec b/ApacheThrift.nuspec
index 6dc3225..61caf57 100644
--- a/ApacheThrift.nuspec
+++ b/ApacheThrift.nuspec
@@ -15,11 +15,9 @@
 
   Instructions for building a nuget package:
 
-  1. Open Thrift.sln in lib\csharp\src and build the release version
-     of the "Thrift" and "Thrift.45" projects.
-  2. Open Thrift.sln in lib\netstd and build the release version of
+  1. Open Thrift.sln in lib\netstd and build the release version of
      the "Thrift" project.
-  3. nuget setApiKey <your-api-key>
+  2. nuget setApiKey <your-api-key>
   3. nuget pack ApacheThrift.nuspec -Symbols -SymbolPackageFormat snupkg
   4. nuget push ApacheThrift.0.14.0.nupkg -Source https://api.nuget.org/v3/index.json
   -->
@@ -36,15 +34,12 @@
     <requireLicenseAcceptance>true</requireLicenseAcceptance>
     <summary>Apache Thrift .NET Library</summary>
     <description>
-      Contains runtime libraries from lib/csharp for net35 and net45 frameworks, 
-      and from lib/netstd for netstandard2.0 framework development.
+      Contains runtime libraries from lib/netstd for netstandard2.0 framework development.
     </description>
     <repository type="GitHub" url="https://github.com/apache/thrift" branch="release/0.14.0" />
     <tags>Apache Thrift RPC</tags>
   </metadata>
   <files>
-    <file src="lib\csharp\src\bin\Release\Thrift.*" target="lib\net35" />
-    <file src="lib\csharp\src\bin\Release\Thrift45.*" target="lib\net45" />
     <file src="lib\netstd\Thrift\bin\Release\netstandard2.0\*.*" target="lib\netstandard2.0" />
   </files>
 </package>
\ No newline at end of file
diff --git a/CHANGES.md b/CHANGES.md
index abd709b..10abcbb 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -6,6 +6,7 @@
 
 - [THRIFT-4990](https://issues.apache.org/jira/browse/THRIFT-4990) - Upgrade to .NET Core 3.1 (LTS)
 - [THRIFT-4981](https://issues.apache.org/jira/browse/THRIFT-4981) - Remove deprecated netcore bindings from the code base
+- [THRIFT-4982](https://issues.apache.org/jira/browse/THRIFT-4982) - Remove deprecated csharp bindings from the code base
 - [THRIFT-5006](https://issues.apache.org/jira/browse/THRIFT-5006) - Implement DEFAULT_MAX_LENGTH at TFramedTransport
 - [THRIFT-5069](https://issues.apache.org/jira/browse/THRIFT-5069) - In Go library TDeserializer.Transport is now typed \*TMemoryBuffer instead of TTransport
 - [THRIFT-5072](https://issues.apache.org/jira/browse/THRIFT-5072) - Haskell generator fails to distinguish between multiple enum types with conflicting enum identifiers
diff --git a/LANGUAGES.md b/LANGUAGES.md
index afd7799..8db4172 100644
--- a/LANGUAGES.md
+++ b/LANGUAGES.md
@@ -91,17 +91,6 @@ Thrift's core protocol is TBinary, supported by all languages except for JavaScr
 <td align=left><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22C%2B%2B%20-%20Compiler%22%2C%20%22C%2B%2B%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">C++</a></td>
 </tr>
 <tr align=center>
-<td align=left><a href="https://github.com/apache/thrift/blob/master/lib/csharp/README.md">C#</a></td>
-<!-- Since -----------------><td>0.2.0<br>Deprecated<br>use netstd</td>
-<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td>
-<!-- Language Levels -------><td>.NET&nbsp;3.5 / mono&nbsp;3.2.8.0</td><td>.NET&nbsp;4.6.1 / mono&nbsp;4.6.2.7</td>
-<!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td>
-<!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td>
-<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td>
-<!-- Servers ---------------><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td>
-<td align=left><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22C%23%20-%20Compiler%22%2C%20%22C%23%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">C# (.NET)</a></td>
-</tr>
-<tr align=center>
 <td align=left><a href="https://github.com/apache/thrift/blob/master/lib/cl/README.md">Common LISP</a></td>
 <!-- Since -----------------><td>0.12.0</td>
 <!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td>
@@ -146,17 +135,6 @@ Thrift's core protocol is TBinary, supported by all languages except for JavaScr
 <td align=left><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22Delphi%20-%20Compiler%22%2C%20%22Delphi%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">Delphi</a></td>
 </tr>
 <tr align=center>
-<td align=left><a href="https://github.com/apache/thrift/blob/master/lib/netcore/README.md">.NET Core</a></td>
-<!-- Since -----------------><td>0.11.0<br>Deprecated<br>use netstd</td>
-<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td>
-<!-- Language Levels -------><td>2.1.4</td><td>2.2.101</td>
-<!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td>
-<!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td>
-<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td>
-<!-- Servers ---------------><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cred.png" alt=""/></td>
-<td align=left><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22netcore%20-%20Compiler%22%2C%20%22netcore%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">.NET Core</a></td>
-</tr>
-<tr align=center>
 <td align=left><a href="https://github.com/apache/thrift/blob/master/lib/netstd/README.md">.NET Standard</a></td>
 <!-- Since -----------------><td>0.13.0</td>
 <!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td>
diff --git a/Makefile.am b/Makefile.am
index 5832077..f9d59ef 100755
--- a/Makefile.am
+++ b/Makefile.am
@@ -78,7 +78,7 @@ empty :=
 space := $(empty) $(empty)
 comma := ,
 
-CROSS_LANGS = @MAYBE_CPP@ @MAYBE_C_GLIB@ @MAYBE_CL@ @MAYBE_D@ @MAYBE_JAVA@ @MAYBE_CSHARP@ @MAYBE_PYTHON@ @MAYBE_PY3@ @MAYBE_RUBY@ @MAYBE_HASKELL@ @MAYBE_PERL@ @MAYBE_PHP@ @MAYBE_GO@ @MAYBE_NODEJS@ @MAYBE_DART@ @MAYBE_ERLANG@ @MAYBE_LUA@ @MAYBE_RS@ @MAYBE_NETSTD@ @MAYBE_NODETS@
+CROSS_LANGS = @MAYBE_CPP@ @MAYBE_C_GLIB@ @MAYBE_CL@ @MAYBE_D@ @MAYBE_JAVA@ @MAYBE_PYTHON@ @MAYBE_PY3@ @MAYBE_RUBY@ @MAYBE_HASKELL@ @MAYBE_PERL@ @MAYBE_PHP@ @MAYBE_GO@ @MAYBE_NODEJS@ @MAYBE_DART@ @MAYBE_ERLANG@ @MAYBE_LUA@ @MAYBE_RS@ @MAYBE_NETSTD@ @MAYBE_NODETS@
 CROSS_LANGS_COMMA_SEPARATED = $(subst $(space),$(comma),$(CROSS_LANGS))
 
 if WITH_PY3
diff --git a/build/docker/old/debian-jessie/Dockerfile b/build/docker/old/debian-jessie/Dockerfile
index 941b4bb..a49b207 100644
--- a/build/docker/old/debian-jessie/Dockerfile
+++ b/build/docker/old/debian-jessie/Dockerfile
@@ -125,11 +125,6 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
       npm
 
 RUN apt-get update && apt-get install -y --no-install-recommends \
-`# CSharp dependencies` \
-      libmono-system-web2.0-cil \
-      mono-devel
-
-RUN apt-get update && apt-get install -y --no-install-recommends \
 `# D dependencies` \
       xdg-utils \
 `# Dart dependencies` \
diff --git a/build/docker/old/debian-stretch/Dockerfile b/build/docker/old/debian-stretch/Dockerfile
index 503eecd..48db7e1 100644
--- a/build/docker/old/debian-stretch/Dockerfile
+++ b/build/docker/old/debian-stretch/Dockerfile
@@ -77,10 +77,6 @@ RUN apt-get install -y --no-install-recommends \
       qtbase5-dev-tools
 
 RUN apt-get install -y --no-install-recommends \
-`# csharp (mono) dependencies` \
-      mono-devel
-
-RUN apt-get install -y --no-install-recommends \
 `# D dependencies` \
       dmd-bin \
       libevent-dev \
diff --git a/build/docker/old/ubuntu-artful/Dockerfile b/build/docker/old/ubuntu-artful/Dockerfile
index abe84d1..813ef06 100644
--- a/build/docker/old/ubuntu-artful/Dockerfile
+++ b/build/docker/old/ubuntu-artful/Dockerfile
@@ -39,10 +39,6 @@ RUN apt-get update && \
       software-properties-common \
       wget
 
-# csharp (mono) - if we ever want a later version
-# RUN echo "deb http://download.mono-project.com/repo/debian xenial main" | tee /etc/apt/sources.list.d/mono.list && \
-#     apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A6A19B38D3D831EF
-
 # Dart
 RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
     curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > \
@@ -89,10 +85,6 @@ RUN apt-get install -y --no-install-recommends \
       qtbase5-dev \
       qtbase5-dev-tools
 
-RUN apt-get install -y --no-install-recommends \
-`# csharp (mono) dependencies` \
-      mono-devel
-
 ENV SBCL_VERSION 1.4.5
 RUN \
 `# Common Lisp (sbcl) dependencies` \
diff --git a/build/docker/old/ubuntu-trusty/Dockerfile b/build/docker/old/ubuntu-trusty/Dockerfile
index a8e4d3b..96c1540 100644
--- a/build/docker/old/ubuntu-trusty/Dockerfile
+++ b/build/docker/old/ubuntu-trusty/Dockerfile
@@ -75,10 +75,6 @@ RUN apt-get install -y --no-install-recommends \
       qtbase5-dev-tools
 
 RUN apt-get install -y --no-install-recommends \
-`# csharp (mono) dependencies` \
-      mono-devel
-
-RUN apt-get install -y --no-install-recommends \
 `# D dependencies` \
       dmd-bin=2.070.2-0 \
       libphobos2-dev=2.070.2-0 \
diff --git a/build/docker/ubuntu-bionic/Dockerfile b/build/docker/ubuntu-bionic/Dockerfile
index fa8a2da..464af0b 100644
--- a/build/docker/ubuntu-bionic/Dockerfile
+++ b/build/docker/ubuntu-bionic/Dockerfile
@@ -89,10 +89,6 @@ RUN apt-get install -y --no-install-recommends \
       qtbase5-dev \
       qtbase5-dev-tools
 
-RUN apt-get install -y --no-install-recommends \
-`# csharp (mono) dependencies` \
-      mono-devel
-
 ENV SBCL_VERSION 1.5.3
 RUN \
 `# Common Lisp (sbcl) dependencies` \
diff --git a/build/docker/ubuntu-disco/Dockerfile b/build/docker/ubuntu-disco/Dockerfile
index fd9464b..247bcf1 100644
--- a/build/docker/ubuntu-disco/Dockerfile
+++ b/build/docker/ubuntu-disco/Dockerfile
@@ -89,10 +89,6 @@ RUN apt-get install -y --no-install-recommends \
       qtbase5-dev \
       qtbase5-dev-tools
 
-RUN apt-get install -y --no-install-recommends \
-`# csharp (mono) dependencies` \
-      mono-devel
-
 ENV SBCL_VERSION 1.5.3
 RUN \
 `# Common Lisp (sbcl) dependencies` \
diff --git a/build/docker/ubuntu-xenial/Dockerfile b/build/docker/ubuntu-xenial/Dockerfile
index af91e1b..fbbe1c2 100644
--- a/build/docker/ubuntu-xenial/Dockerfile
+++ b/build/docker/ubuntu-xenial/Dockerfile
@@ -37,10 +37,6 @@ RUN apt-get update && \
       software-properties-common \
       wget && \
 
-# csharp (mono)
-# echo "deb http://download.mono-project.com/repo/debian xenial main" | tee /etc/apt/sources.list.d/mono.list && \
-#     apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A6A19B38D3D831EF && \
-
 # D
     apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EBCF975E5BA24D5E && \
     wget http://master.dl.sourceforge.net/project/d-apt/files/d-apt.list -O /etc/apt/sources.list.d/d-apt.list && \
@@ -94,10 +90,6 @@ RUN apt-get install -y --no-install-recommends \
       qtbase5-dev \
       qtbase5-dev-tools
 
-RUN apt-get install -y --no-install-recommends \
-`# csharp (mono) dependencies` \
-      mono-devel
-
 ENV D_VERSION 2.075.1-0
 RUN apt-get install -y --allow-unauthenticated --no-install-recommends \
 `# D dependencies` \
diff --git a/build/veralign.sh b/build/veralign.sh
index c15e001..422da85 100755
--- a/build/veralign.sh
+++ b/build/veralign.sh
@@ -49,24 +49,16 @@ FILES[doap.rdf]=manual
 
 # These files can be updated automatically:
 FILES[ApacheThrift.nuspec]=simpleReplace
-FILES[CMakeLists.txt]=simpleReplace
-FILES[Thrift.podspec]=simpleReplace
 FILES[appveyor.yml]=simpleReplace
 FILES[bower.json]=jsonReplace
-FILES[configure.ac]=configureReplace
+FILES[CMakeLists.txt]=simpleReplace
 FILES[compiler/cpp/src/thrift/version.h]=simpleReplace
+FILES[configure.ac]=configureReplace
+FILES[contrib/Rebus/Properties/AssemblyInfo.cs]=simpleReplace
 FILES[contrib/thrift.spec]=simpleReplace
+FILES[contrib/zeromq/csharp/AssemblyInfo.cs]=simpleReplace
 FILES[doc/specs/idl.md]=simpleReplace
 FILES[lib/as3/gradle.properties]=simpleReplace
-FILES[lib/csharp/ThriftMSBuildTask/Properties/AssemblyInfo.cs]=simpleReplace
-FILES[lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj]=simpleReplace
-FILES[lib/csharp/src/Properties/AssemblyInfo.cs]=simpleReplace
-FILES[lib/csharp/src/Thrift.csproj]=simpleReplace
-FILES[lib/csharp/test/Multiplex/Client/MultiplexClient.csproj]=simpleReplace
-FILES[lib/csharp/test/Multiplex/Client/Properties/AssemblyInfo.cs]=simpleReplace
-FILES[lib/csharp/test/Multiplex/Server/MultiplexServer.csproj]=simpleReplace
-FILES[lib/csharp/test/Multiplex/Server/Properties/AssemblyInfo.cs]=simpleReplace
-FILES[lib/csharp/test/ThriftMVCTest/Properties/AssemblyInfo.cs]=simpleReplace
 FILES[lib/d/src/thrift/base.d]=simpleReplace
 FILES[lib/dart/pubspec.yaml]=pubspecReplace
 FILES[lib/delphi/src/Thrift.pas]=simpleReplace
@@ -74,10 +66,12 @@ FILES[lib/erl/src/thrift.app.src]=simpleReplace
 FILES[lib/haxe/haxelib.json]=simpleReplace
 FILES[lib/hs/thrift.cabal]=simpleReplace
 FILES[lib/java/gradle.properties]=simpleReplace
-FILES[lib/js/package.json]=jsonReplace
 FILES[lib/js/package-lock.json]=jsonReplace
+FILES[lib/js/package.json]=jsonReplace
 FILES[lib/js/src/thrift.js]=simpleReplace
 FILES[lib/lua/Thrift.lua]=simpleReplace
+FILES[lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Properties/AssemblyInfo.cs]=simpleReplace
+FILES[lib/netstd/Thrift/Properties/AssemblyInfo.cs]=simpleReplace
 FILES[lib/netstd/Thrift/Properties/AssemblyInfo.cs]=simpleReplace
 FILES[lib/netstd/Thrift/Thrift.csproj]=simpleReplace
 FILES[lib/ocaml/_oasis]=simpleReplace
@@ -88,25 +82,29 @@ FILES[lib/rs/Cargo.toml]=simpleReplace
 FILES[lib/st/package.xml]=simpleReplace
 FILES[lib/swift/Sources/Thrift.swift]=simpleReplace
 FILES[lib/swift/Tests/ThriftTests/ThriftTests.swift]=simpleReplace
-FILES[lib/ts/package.json]=jsonReplace
 FILES[lib/ts/package-lock.json]=jsonReplace
-FILES[package.json]=jsonReplace
+FILES[lib/ts/package.json]=jsonReplace
 FILES[package-lock.json]=jsonReplace
+FILES[package.json]=jsonReplace
 FILES[sonar-project.properties]=simpleReplace
-FILES[test/csharp/Properties/AssemblyInfo.cs]=simpleReplace
-FILES[test/csharp/ThriftTest.csproj]=simpleReplace
 FILES[test/dart/test_client/pubspec.yaml]=pubspecReplace
 FILES[test/erl/src/thrift_test.app.src]=simpleReplace
-FILES[tutorial/csharp/CsharpClient/Properties/AssemblyInfo.cs]=simpleReplace
-FILES[tutorial/csharp/CsharpServer/Properties/AssemblyInfo.cs]=simpleReplace
+FILES[test/netstd/Client/Properties/AssemblyInfo.cs]=simpleReplace
+FILES[test/netstd/Server/Properties/AssemblyInfo.cs]=simpleReplace
+FILES[Thrift.podspec]=simpleReplace
 FILES[tutorial/dart/client/pubspec.yaml]=pubspecReplace
 FILES[tutorial/dart/console_client/pubspec.yaml]=pubspecReplace
 FILES[tutorial/dart/server/pubspec.yaml]=pubspecReplace
 FILES[tutorial/delphi/DelphiClient/DelphiClient.dproj]=simpleReplace
 FILES[tutorial/delphi/DelphiServer/DelphiServer.dproj]=simpleReplace
 FILES[tutorial/hs/ThriftTutorial.cabal]=simpleReplace
+FILES[tutorial/netstd/Client/Properties/AssemblyInfo.cs]=simpleReplace
+FILES[tutorial/netstd/Interfaces/Properties/AssemblyInfo.cs]=simpleReplace
+FILES[tutorial/netstd/Server/Properties/AssemblyInfo.cs]=simpleReplace
 FILES[tutorial/ocaml/_oasis]=simpleReplace
 
+
+
 if [ ! -f "CHANGES.md" ]; then
     >&2 echo "error: run veralign.sh while in the thrift root directory"
     exit 1
diff --git a/compiler/cpp/CMakeLists.txt b/compiler/cpp/CMakeLists.txt
index 4dd316c..7125cd7 100644
--- a/compiler/cpp/CMakeLists.txt
+++ b/compiler/cpp/CMakeLists.txt
@@ -76,7 +76,6 @@ THRIFT_ADD_COMPILER(as3     "Enable compiler for ActionScript 3" ON)
 THRIFT_ADD_COMPILER(c_glib  "Enable compiler for C with Glib" ON)
 THRIFT_ADD_COMPILER(cl      "Enable compiler for Common LISP" ON)
 THRIFT_ADD_COMPILER(cpp     "Enable compiler for C++" ON)
-THRIFT_ADD_COMPILER(csharp  "Enable compiler for C#" ON)
 THRIFT_ADD_COMPILER(d       "Enable compiler for D" ON)
 THRIFT_ADD_COMPILER(dart    "Enable compiler for Dart" ON)
 THRIFT_ADD_COMPILER(delphi  "Enable compiler for Delphi" ON)
diff --git a/compiler/cpp/Makefile.am b/compiler/cpp/Makefile.am
index d0ac874..5c0949e 100644
--- a/compiler/cpp/Makefile.am
+++ b/compiler/cpp/Makefile.am
@@ -73,7 +73,6 @@ thrift_SOURCES += src/thrift/generate/t_as3_generator.cc \
                   src/thrift/generate/t_c_glib_generator.cc \
                   src/thrift/generate/t_cl_generator.cc \
                   src/thrift/generate/t_cpp_generator.cc \
-                  src/thrift/generate/t_csharp_generator.cc \
                   src/thrift/generate/t_d_generator.cc \
                   src/thrift/generate/t_dart_generator.cc \
                   src/thrift/generate/t_delphi_generator.cc \
diff --git a/compiler/cpp/compiler.vcxproj b/compiler/cpp/compiler.vcxproj
index 5d073e7..79045d7 100644
--- a/compiler/cpp/compiler.vcxproj
+++ b/compiler/cpp/compiler.vcxproj
@@ -57,7 +57,6 @@
     <ClCompile Include="src\thrift\generate\t_c_glib_generator.cc" />
     <ClCompile Include="src\thrift\generate\t_cl_generator.cc" />
     <ClCompile Include="src\thrift\generate\t_cpp_generator.cc" />
-    <ClCompile Include="src\thrift\generate\t_csharp_generator.cc" />
     <ClCompile Include="src\thrift\generate\t_d_generator.cc" />
     <ClCompile Include="src\thrift\generate\t_dart_generator.cc" />
     <ClCompile Include="src\thrift\generate\t_delphi_generator.cc" />
diff --git a/compiler/cpp/compiler.vcxproj.filters b/compiler/cpp/compiler.vcxproj.filters
index 664a9d9..75ab292 100644
--- a/compiler/cpp/compiler.vcxproj.filters
+++ b/compiler/cpp/compiler.vcxproj.filters
@@ -101,9 +101,6 @@
     <ClCompile Include="src\generate\t_cpp_generator.cc">
       <Filter>generate</Filter>
     </ClCompile>
-    <ClCompile Include="src\generate\t_csharp_generator.cc">
-      <Filter>generate</Filter>
-    </ClCompile>
     <ClCompile Include="src\generate\t_c_glib_generator.cc">
       <Filter>generate</Filter>
     </ClCompile>
diff --git a/compiler/cpp/src/thrift/generate/t_csharp_generator.cc b/compiler/cpp/src/thrift/generate/t_csharp_generator.cc
deleted file mode 100644
index a6ece80..0000000
--- a/compiler/cpp/src/thrift/generate/t_csharp_generator.cc
+++ /dev/null
@@ -1,3261 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-#include <cassert>
-
-#include <string>
-#include <fstream>
-#include <iostream>
-#include <vector>
-#include <cctype>
-
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <sstream>
-
-#include "thrift/platform.h"
-#include "thrift/generate/t_oop_generator.h"
-
-using std::map;
-using std::ostream;
-using std::ostringstream;
-using std::string;
-using std::stringstream;
-using std::vector;
-
-static const string endl = "\n"; // avoid ostream << std::endl flushes
-
-struct member_mapping_scope {
-  void* scope_member;
-  std::map<std::string, std::string> mapping_table;
-};
-
-class t_csharp_generator : public t_oop_generator {
-public:
-  t_csharp_generator(t_program* program,
-                     const std::map<std::string, std::string>& parsed_options,
-                     const std::string& option_string)
-    : t_oop_generator(program) {
-    (void)option_string;
-
-    std::map<std::string, std::string>::const_iterator iter;
-
-    async_ = false;
-    nullable_ = false;
-    hashcode_ = false;
-    union_ = false;
-    serialize_ = false;
-    wcf_ = false;
-    wcf_namespace_.clear();
-    for( iter = parsed_options.begin(); iter != parsed_options.end(); ++iter) {
-      if( iter->first.compare("async") == 0) {
-        async_ = true;
-      } else if( iter->first.compare("nullable") == 0) {
-        nullable_ = true;
-      } else if( iter->first.compare("hashcode") == 0) {
-        hashcode_ = true;
-      } else if( iter->first.compare("union") == 0) {
-        union_ = true;
-      } else if( iter->first.compare("serial") == 0) {
-        serialize_ = true;
-        wcf_namespace_ = iter->second; // since there can be only one namespace
-      } else if( iter->first.compare("wcf") == 0) {
-        wcf_ = true;
-        wcf_namespace_ = iter->second;
-      } else {
-        throw "unknown option csharp:" + iter->first;
-      }
-    }
-
-    pwarning(1, "The 'csharp' target is deprecated. Consider using 'netstd' instead.\n");
-
-    out_dir_base_ = "gen-csharp";
-  }
-  void init_generator() override;
-  void close_generator() override;
-
-  void generate_consts(std::vector<t_const*> consts) override;
-
-  void generate_typedef(t_typedef* ttypedef) override;
-  void generate_enum(t_enum* tenum) override;
-  void generate_struct(t_struct* tstruct) override;
-  void generate_union(t_struct* tunion);
-  void generate_xception(t_struct* txception) override;
-  void generate_service(t_service* tservice) override;
-  void generate_property(ostream& out, t_field* tfield, bool isPublic, bool generateIsset);
-  void generate_csharp_property(ostream& out,
-                                t_field* tfield,
-                                bool isPublic,
-                                bool includeIsset = true,
-                                std::string fieldPrefix = "");
-  bool print_const_value(std::ostream& out,
-                         std::string name,
-                         t_type* type,
-                         t_const_value* value,
-                         bool in_static,
-                         bool defval = false,
-                         bool needtype = false);
-  std::string render_const_value(std::ostream& out,
-                                 std::string name,
-                                 t_type* type,
-                                 t_const_value* value);
-  void print_const_constructor(std::ostream& out, std::vector<t_const*> consts);
-  void print_const_def_value(std::ostream& out,
-                             std::string name,
-                             t_type* type,
-                             t_const_value* value);
-
-  void generate_csharp_struct(t_struct* tstruct, bool is_exception);
-  void generate_csharp_union(t_struct* tunion);
-  void generate_csharp_struct_definition(std::ostream& out,
-                                         t_struct* tstruct,
-                                         bool is_xception = false,
-                                         bool in_class = false,
-                                         bool is_result = false);
-  void generate_csharp_union_definition(std::ostream& out, t_struct* tunion);
-  void generate_csharp_union_class(std::ostream& out, t_struct* tunion, t_field* tfield);
-  void generate_csharp_wcffault(std::ostream& out, t_struct* tstruct);
-  void generate_csharp_struct_reader(std::ostream& out, t_struct* tstruct);
-  void generate_csharp_struct_result_writer(std::ostream& out, t_struct* tstruct);
-  void generate_csharp_struct_writer(std::ostream& out, t_struct* tstruct);
-  void generate_csharp_struct_tostring(std::ostream& out, t_struct* tstruct);
-  void generate_csharp_struct_equals(std::ostream& out, t_struct* tstruct);
-  void generate_csharp_struct_hashcode(std::ostream& out, t_struct* tstruct);
-  void generate_csharp_union_reader(std::ostream& out, t_struct* tunion);
-
-  void generate_function_helpers(t_function* tfunction);
-  void generate_service_interface(t_service* tservice);
-  void generate_separate_service_interfaces(t_service* tservice);
-  void generate_sync_service_interface(t_service* tservice);
-  void generate_async_service_interface(t_service* tservice);
-  void generate_combined_service_interface(t_service* tservice);
-  void generate_silverlight_async_methods(t_service* tservice);
-  void generate_service_helpers(t_service* tservice);
-  void generate_service_client(t_service* tservice);
-  void generate_service_server(t_service* tservice);
-  void generate_service_server_sync(t_service* tservice);
-  void generate_service_server_async(t_service* tservice);
-  void generate_process_function(t_service* tservice, t_function* function);
-  void generate_process_function_async(t_service* tservice, t_function* function);
-
-  void generate_deserialize_field(std::ostream& out,
-                                  t_field* tfield,
-                                  std::string prefix = "",
-                                  bool is_propertyless = false);
-  void generate_deserialize_struct(std::ostream& out, t_struct* tstruct, std::string prefix = "");
-  void generate_deserialize_container(std::ostream& out, t_type* ttype, std::string prefix = "");
-  void generate_deserialize_set_element(std::ostream& out, t_set* tset, std::string prefix = "");
-  void generate_deserialize_map_element(std::ostream& out, t_map* tmap, std::string prefix = "");
-  void generate_deserialize_list_element(std::ostream& out, t_list* list, std::string prefix = "");
-  void generate_serialize_field(std::ostream& out,
-                                t_field* tfield,
-                                std::string prefix = "",
-                                bool is_element = false,
-                                bool is_propertyless = false);
-  void generate_serialize_struct(std::ostream& out, t_struct* tstruct, std::string prefix = "");
-  void generate_serialize_container(std::ostream& out, t_type* ttype, std::string prefix = "");
-  void generate_serialize_map_element(std::ostream& out,
-                                      t_map* tmap,
-                                      std::string iter,
-                                      std::string map);
-  void generate_serialize_set_element(std::ostream& out, t_set* tmap, std::string iter);
-  void generate_serialize_list_element(std::ostream& out, t_list* tlist, std::string iter);
-
-  void generate_csharp_doc(std::ostream& out, t_field* field);
-  void generate_csharp_doc(std::ostream& out, t_doc* tdoc);
-  void generate_csharp_doc(std::ostream& out, t_function* tdoc);
-  void generate_csharp_docstring_comment(std::ostream& out, string contents);
-
-  void start_csharp_namespace(std::ostream& out);
-  void end_csharp_namespace(std::ostream& out);
-
-  std::string csharp_type_usings();
-  std::string csharp_thrift_usings();
-
-  std::string type_name(t_type* ttype,
-                        bool in_countainer = false,
-                        bool in_init = false,
-                        bool in_param = false,
-                        bool is_required = false);
-  std::string base_type_name(t_base_type* tbase,
-                             bool in_container = false,
-                             bool in_param = false,
-                             bool is_required = false);
-  std::string declare_field(t_field* tfield, bool init = false, std::string prefix = "");
-  std::string function_signature_async_begin(t_function* tfunction, std::string prefix = "");
-  std::string function_signature_async_end(t_function* tfunction, std::string prefix = "");
-  std::string function_signature_async(t_function* tfunction, std::string prefix = "");
-  std::string function_signature(t_function* tfunction, std::string prefix = "");
-  std::string argument_list(t_struct* tstruct);
-  std::string type_to_enum(t_type* ttype);
-  std::string prop_name(t_field* tfield, bool suppress_mapping = false);
-  std::string get_enum_class_name(t_type* type) override;
-
-  bool field_has_default(t_field* tfield) { return tfield->get_value() != NULL; }
-
-  bool field_is_required(t_field* tfield) { return tfield->get_req() == t_field::T_REQUIRED; }
-
-  bool type_can_be_null(t_type* ttype) {
-    while (ttype->is_typedef()) {
-      ttype = ((t_typedef*)ttype)->get_type();
-    }
-
-    return ttype->is_container() || ttype->is_struct() || ttype->is_xception()
-           || ttype->is_string();
-  }
-
-private:
-  std::string namespace_name_;
-  ofstream_with_content_based_conditional_update f_service_;
-  std::string namespace_dir_;
-  bool async_;
-  bool nullable_;
-  bool union_;
-  bool hashcode_;
-  bool serialize_;
-  bool wcf_;
-  std::string wcf_namespace_;
-
-  std::map<std::string, int> csharp_keywords;
-  std::vector<member_mapping_scope>  member_mapping_scopes;
-
-  void init_keywords();
-  std::string normalize_name(std::string name);
-  std::string make_valid_csharp_identifier(std::string const& fromName);
-  void prepare_member_name_mapping(t_struct* tstruct);
-  void prepare_member_name_mapping(void* scope,
-                                   const vector<t_field*>& members,
-                                   const string& structname);
-  void cleanup_member_name_mapping(void* scope);
-  string get_mapped_member_name(string oldname);
-};
-
-void t_csharp_generator::init_generator() {
-  MKDIR(get_out_dir().c_str());
-  namespace_name_ = program_->get_namespace("csharp");
-
-  string dir = namespace_name_;
-  string subdir = get_out_dir().c_str();
-  string::size_type loc;
-
-  while ((loc = dir.find(".")) != string::npos) {
-    subdir = subdir + "/" + dir.substr(0, loc);
-    MKDIR(subdir.c_str());
-    dir = dir.substr(loc + 1);
-  }
-  if (dir.size() > 0) {
-    subdir = subdir + "/" + dir;
-    MKDIR(subdir.c_str());
-  }
-
-  namespace_dir_ = subdir;
-  init_keywords();
-
-  while( ! member_mapping_scopes.empty()) {
-    cleanup_member_name_mapping( member_mapping_scopes.back().scope_member);
-  }
-
-  pverbose("C# options:\n");
-  pverbose("- async ...... %s\n", (async_ ? "ON" : "off"));
-  pverbose("- nullable ... %s\n", (nullable_ ? "ON" : "off"));
-  pverbose("- union ...... %s\n", (union_ ? "ON" : "off"));
-  pverbose("- hashcode ... %s\n", (hashcode_ ? "ON" : "off"));
-  pverbose("- serialize .. %s\n", (serialize_ ? "ON" : "off"));
-  pverbose("- wcf ........ %s\n", (wcf_ ? "ON" : "off"));
-}
-
-std::string t_csharp_generator::normalize_name(std::string name) {
-  string tmp(name);
-  std::transform(tmp.begin(), tmp.end(), tmp.begin(), static_cast<int (*)(int)>(std::tolower));
-
-  // un-conflict keywords by prefixing with "@"
-  if (csharp_keywords.find(tmp) != csharp_keywords.end()) {
-    return "@" + name;
-  }
-
-  // no changes necessary
-  return name;
-}
-
-void t_csharp_generator::init_keywords() {
-  csharp_keywords.clear();
-
-  // C# keywords
-  csharp_keywords["abstract"] = 1;
-  csharp_keywords["as"] = 1;
-  csharp_keywords["base"] = 1;
-  csharp_keywords["bool"] = 1;
-  csharp_keywords["break"] = 1;
-  csharp_keywords["byte"] = 1;
-  csharp_keywords["case"] = 1;
-  csharp_keywords["catch"] = 1;
-  csharp_keywords["char"] = 1;
-  csharp_keywords["checked"] = 1;
-  csharp_keywords["class"] = 1;
-  csharp_keywords["const"] = 1;
-  csharp_keywords["continue"] = 1;
-  csharp_keywords["decimal"] = 1;
-  csharp_keywords["default"] = 1;
-  csharp_keywords["delegate"] = 1;
-  csharp_keywords["do"] = 1;
-  csharp_keywords["double"] = 1;
-  csharp_keywords["else"] = 1;
-  csharp_keywords["enum"] = 1;
-  csharp_keywords["event"] = 1;
-  csharp_keywords["explicit"] = 1;
-  csharp_keywords["extern"] = 1;
-  csharp_keywords["false"] = 1;
-  csharp_keywords["finally"] = 1;
-  csharp_keywords["fixed"] = 1;
-  csharp_keywords["float"] = 1;
-  csharp_keywords["for"] = 1;
-  csharp_keywords["foreach"] = 1;
-  csharp_keywords["goto"] = 1;
-  csharp_keywords["if"] = 1;
-  csharp_keywords["implicit"] = 1;
-  csharp_keywords["in"] = 1;
-  csharp_keywords["int"] = 1;
-  csharp_keywords["interface"] = 1;
-  csharp_keywords["internal"] = 1;
-  csharp_keywords["is"] = 1;
-  csharp_keywords["lock"] = 1;
-  csharp_keywords["long"] = 1;
-  csharp_keywords["namespace"] = 1;
-  csharp_keywords["new"] = 1;
-  csharp_keywords["null"] = 1;
-  csharp_keywords["object"] = 1;
-  csharp_keywords["operator"] = 1;
-  csharp_keywords["out"] = 1;
-  csharp_keywords["override"] = 1;
-  csharp_keywords["params"] = 1;
-  csharp_keywords["private"] = 1;
-  csharp_keywords["protected"] = 1;
-  csharp_keywords["public"] = 1;
-  csharp_keywords["readonly"] = 1;
-  csharp_keywords["ref"] = 1;
-  csharp_keywords["return"] = 1;
-  csharp_keywords["sbyte"] = 1;
-  csharp_keywords["sealed"] = 1;
-  csharp_keywords["short"] = 1;
-  csharp_keywords["sizeof"] = 1;
-  csharp_keywords["stackalloc"] = 1;
-  csharp_keywords["static"] = 1;
-  csharp_keywords["string"] = 1;
-  csharp_keywords["struct"] = 1;
-  csharp_keywords["switch"] = 1;
-  csharp_keywords["this"] = 1;
-  csharp_keywords["throw"] = 1;
-  csharp_keywords["true"] = 1;
-  csharp_keywords["try"] = 1;
-  csharp_keywords["typeof"] = 1;
-  csharp_keywords["uint"] = 1;
-  csharp_keywords["ulong"] = 1;
-  csharp_keywords["unchecked"] = 1;
-  csharp_keywords["unsafe"] = 1;
-  csharp_keywords["ushort"] = 1;
-  csharp_keywords["using"] = 1;
-  csharp_keywords["virtual"] = 1;
-  csharp_keywords["void"] = 1;
-  csharp_keywords["volatile"] = 1;
-  csharp_keywords["while"] = 1;
-
-  // C# contextual keywords
-  csharp_keywords["add"] = 1;
-  csharp_keywords["alias"] = 1;
-  csharp_keywords["ascending"] = 1;
-  csharp_keywords["async"] = 1;
-  csharp_keywords["await"] = 1;
-  csharp_keywords["descending"] = 1;
-  csharp_keywords["dynamic"] = 1;
-  csharp_keywords["from"] = 1;
-  csharp_keywords["get"] = 1;
-  csharp_keywords["global"] = 1;
-  csharp_keywords["group"] = 1;
-  csharp_keywords["into"] = 1;
-  csharp_keywords["join"] = 1;
-  csharp_keywords["let"] = 1;
-  csharp_keywords["orderby"] = 1;
-  csharp_keywords["partial"] = 1;
-  csharp_keywords["remove"] = 1;
-  csharp_keywords["select"] = 1;
-  csharp_keywords["set"] = 1;
-  csharp_keywords["value"] = 1;
-  csharp_keywords["var"] = 1;
-  csharp_keywords["where"] = 1;
-  csharp_keywords["yield"] = 1;
-}
-
-void t_csharp_generator::start_csharp_namespace(ostream& out) {
-  if (!namespace_name_.empty()) {
-    out << "namespace " << namespace_name_ << "\n";
-    scope_up(out);
-  }
-}
-
-void t_csharp_generator::end_csharp_namespace(ostream& out) {
-  if (!namespace_name_.empty()) {
-    scope_down(out);
-  }
-}
-
-string t_csharp_generator::csharp_type_usings() {
-  return string() + "using System;\n" + "using System.Collections;\n"
-         + "using System.Collections.Generic;\n" + "using System.Text;\n" + "using System.IO;\n"
-         + ((async_) ? "using System.Threading.Tasks;\n" : "") + "using Thrift;\n"
-         + "using Thrift.Collections;\n" + ((serialize_ || wcf_) ? "#if !SILVERLIGHT\n" : "")
-         + ((serialize_ || wcf_) ? "using System.Xml.Serialization;\n" : "")
-         + ((serialize_ || wcf_) ? "#endif\n" : "")
-         + "using System.Runtime.Serialization;\n";
-}
-
-string t_csharp_generator::csharp_thrift_usings() {
-  return string() + "using Thrift.Protocol;\n" + "using Thrift.Transport;\n";
-}
-
-void t_csharp_generator::close_generator() {
-}
-void t_csharp_generator::generate_typedef(t_typedef* ttypedef) {
-  (void)ttypedef;
-}
-
-void t_csharp_generator::generate_enum(t_enum* tenum) {
-  string f_enum_name = namespace_dir_ + "/" + (tenum->get_name()) + ".cs";
-  ofstream_with_content_based_conditional_update f_enum;
-  f_enum.open(f_enum_name.c_str());
-
-  f_enum << autogen_comment() << endl;
-
-  start_csharp_namespace(f_enum);
-
-  generate_csharp_doc(f_enum, tenum);
-
-  indent(f_enum) << "public enum " << tenum->get_name() << "\n";
-  scope_up(f_enum);
-
-  vector<t_enum_value*> constants = tenum->get_constants();
-  vector<t_enum_value*>::iterator c_iter;
-  for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
-    generate_csharp_doc(f_enum, *c_iter);
-
-    int value = (*c_iter)->get_value();
-    indent(f_enum) << (*c_iter)->get_name() << " = " << value << "," << endl;
-  }
-
-  scope_down(f_enum);
-
-  end_csharp_namespace(f_enum);
-
-  f_enum.close();
-}
-
-void t_csharp_generator::generate_consts(std::vector<t_const*> consts) {
-  if (consts.empty()) {
-    return;
-  }
-  string f_consts_name = namespace_dir_ + '/' + program_name_ + ".Constants.cs";
-  ofstream_with_content_based_conditional_update f_consts;
-  f_consts.open(f_consts_name.c_str());
-
-  f_consts << autogen_comment() << csharp_type_usings() << endl;
-
-  start_csharp_namespace(f_consts);
-
-  indent(f_consts) << "public static class " << make_valid_csharp_identifier(program_name_)
-                   << "Constants" << endl;
-  scope_up(f_consts);
-
-  vector<t_const*>::iterator c_iter;
-  bool need_static_constructor = false;
-  for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) {
-    generate_csharp_doc(f_consts, (*c_iter));
-    if (print_const_value(f_consts,
-                          (*c_iter)->get_name(),
-                          (*c_iter)->get_type(),
-                          (*c_iter)->get_value(),
-                          false)) {
-      need_static_constructor = true;
-    }
-  }
-
-  if (need_static_constructor) {
-    print_const_constructor(f_consts, consts);
-  }
-
-  scope_down(f_consts);
-  end_csharp_namespace(f_consts);
-  f_consts.close();
-}
-
-void t_csharp_generator::print_const_def_value(std::ostream& out,
-                                               string name,
-                                               t_type* type,
-                                               t_const_value* value) {
-  if (type->is_struct() || type->is_xception()) {
-    const vector<t_field*>& fields = ((t_struct*)type)->get_members();
-    vector<t_field*>::const_iterator f_iter;
-    const map<t_const_value*, t_const_value*, t_const_value::value_compare>& val = value->get_map();
-    map<t_const_value*, t_const_value*, t_const_value::value_compare>::const_iterator v_iter;
-    prepare_member_name_mapping((t_struct*)type);
-    for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
-      t_field* field = NULL;
-      for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-        if ((*f_iter)->get_name() == v_iter->first->get_string()) {
-          field = (*f_iter);
-        }
-      }
-      if (field == NULL) {
-        throw "type error: " + type->get_name() + " has no field " + v_iter->first->get_string();
-      }
-      t_type* field_type = field->get_type();
-      string val = render_const_value(out, name, field_type, v_iter->second);
-      indent(out) << name << "." << prop_name(field) << " = " << val << ";" << endl;
-    }
-    cleanup_member_name_mapping((t_struct*)type);
-  } else if (type->is_map()) {
-    t_type* ktype = ((t_map*)type)->get_key_type();
-    t_type* vtype = ((t_map*)type)->get_val_type();
-    const map<t_const_value*, t_const_value*, t_const_value::value_compare>& val = value->get_map();
-    map<t_const_value*, t_const_value*, t_const_value::value_compare>::const_iterator v_iter;
-    for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
-      string key = render_const_value(out, name, ktype, v_iter->first);
-      string val = render_const_value(out, name, vtype, v_iter->second);
-      indent(out) << name << "[" << key << "]"
-                  << " = " << val << ";" << endl;
-    }
-  } else if (type->is_list() || type->is_set()) {
-    t_type* etype;
-    if (type->is_list()) {
-      etype = ((t_list*)type)->get_elem_type();
-    } else {
-      etype = ((t_set*)type)->get_elem_type();
-    }
-
-    const vector<t_const_value*>& val = value->get_list();
-    vector<t_const_value*>::const_iterator v_iter;
-    for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
-      string val = render_const_value(out, name, etype, *v_iter);
-      indent(out) << name << ".Add(" << val << ");" << endl;
-    }
-  }
-}
-
-void t_csharp_generator::print_const_constructor(std::ostream& out, std::vector<t_const*> consts) {
-  indent(out) << "static " << make_valid_csharp_identifier(program_name_).c_str() << "Constants()"
-              << endl;
-  scope_up(out);
-  vector<t_const*>::iterator c_iter;
-  for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) {
-    string name = (*c_iter)->get_name();
-    t_type* type = (*c_iter)->get_type();
-    t_const_value* value = (*c_iter)->get_value();
-
-    print_const_def_value(out, name, type, value);
-  }
-  scope_down(out);
-}
-
-// it seems like all that methods that call this are using in_static to be the opposite of what it
-// would imply
-bool t_csharp_generator::print_const_value(std::ostream& out,
-                                           string name,
-                                           t_type* type,
-                                           t_const_value* value,
-                                           bool in_static,
-                                           bool defval,
-                                           bool needtype) {
-  indent(out);
-  bool need_static_construction = !in_static;
-  while (type->is_typedef()) {
-    type = ((t_typedef*)type)->get_type();
-  }
-
-  if (!defval || needtype) {
-    out << (in_static ? "" : type->is_base_type() ? "public const " : "public static ")
-        << type_name(type) << " ";
-  }
-  if (type->is_base_type()) {
-    string v2 = render_const_value(out, name, type, value);
-    out << name << " = " << v2 << ";" << endl;
-    need_static_construction = false;
-  } else if (type->is_enum()) {
-    out << name << " = " << type_name(type, false, true) << "." << value->get_identifier_name()
-        << ";" << endl;
-    need_static_construction = false;
-  } else if (type->is_struct() || type->is_xception()) {
-    out << name << " = new " << type_name(type) << "();" << endl;
-  } else if (type->is_map()) {
-    out << name << " = new " << type_name(type, true, true) << "();" << endl;
-  } else if (type->is_list() || type->is_set()) {
-    out << name << " = new " << type_name(type) << "();" << endl;
-  }
-
-  if (defval && !type->is_base_type() && !type->is_enum()) {
-    print_const_def_value(out, name, type, value);
-  }
-
-  return need_static_construction;
-}
-
-std::string t_csharp_generator::render_const_value(ostream& out,
-                                                   string name,
-                                                   t_type* type,
-                                                   t_const_value* value) {
-  (void)name;
-  std::ostringstream render;
-
-  if (type->is_base_type()) {
-    t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
-    switch (tbase) {
-    case t_base_type::TYPE_STRING:
-      render << '"' << get_escaped_string(value) << '"';
-      break;
-    case t_base_type::TYPE_BOOL:
-      render << ((value->get_integer() > 0) ? "true" : "false");
-      break;
-    case t_base_type::TYPE_I8:
-    case t_base_type::TYPE_I16:
-    case t_base_type::TYPE_I32:
-    case t_base_type::TYPE_I64:
-      render << value->get_integer();
-      break;
-    case t_base_type::TYPE_DOUBLE:
-      if (value->get_type() == t_const_value::CV_INTEGER) {
-        render << value->get_integer();
-      } else {
-        render << value->get_double();
-      }
-      break;
-    default:
-      throw "compiler error: no const of base type " + t_base_type::t_base_name(tbase);
-    }
-  } else if (type->is_enum()) {
-    render << type->get_name() << "." << value->get_identifier_name();
-  } else {
-    string t = tmp("tmp");
-    print_const_value(out, t, type, value, true, true, true);
-    render << t;
-  }
-
-  return render.str();
-}
-
-void t_csharp_generator::generate_struct(t_struct* tstruct) {
-  if (union_ && tstruct->is_union()) {
-    generate_csharp_union(tstruct);
-  } else {
-    generate_csharp_struct(tstruct, false);
-  }
-}
-
-void t_csharp_generator::generate_xception(t_struct* txception) {
-  generate_csharp_struct(txception, true);
-}
-
-void t_csharp_generator::generate_csharp_struct(t_struct* tstruct, bool is_exception) {
-  string f_struct_name = namespace_dir_ + "/" + (tstruct->get_name()) + ".cs";
-  ofstream_with_content_based_conditional_update f_struct;
-
-  f_struct.open(f_struct_name.c_str());
-
-  f_struct << autogen_comment() << csharp_type_usings() << csharp_thrift_usings() << endl;
-
-  generate_csharp_struct_definition(f_struct, tstruct, is_exception);
-
-  f_struct.close();
-}
-
-void t_csharp_generator::generate_csharp_struct_definition(ostream& out,
-                                                           t_struct* tstruct,
-                                                           bool is_exception,
-                                                           bool in_class,
-                                                           bool is_result) {
-
-  if (!in_class) {
-    start_csharp_namespace(out);
-  }
-
-  out << endl;
-
-  generate_csharp_doc(out, tstruct);
-  prepare_member_name_mapping(tstruct);
-
-  indent(out) << "#if !SILVERLIGHT" << endl;
-  indent(out) << "[Serializable]" << endl;
-  indent(out) << "#endif" << endl;
-  if ((serialize_ || wcf_) && !is_exception) {
-    indent(out) << "[DataContract(Namespace=\"" << wcf_namespace_ << "\")]"
-                << endl; // do not make exception classes directly WCF serializable, we provide a
-                         // separate "fault" for that
-  }
-  bool is_final = (tstruct->annotations_.find("final") != tstruct->annotations_.end());
-
-  indent(out) << "public " << (is_final ? "sealed " : "") << "partial class "
-              << normalize_name(tstruct->get_name()) << " : ";
-
-  if (is_exception) {
-    out << "TException, ";
-  }
-  out << "TBase";
-
-  out << endl;
-
-  scope_up(out);
-
-  const vector<t_field*>& members = tstruct->get_members();
-  vector<t_field*>::const_iterator m_iter;
-
-  // make private members with public Properties
-  for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-    // if the field is requied, then we use auto-properties
-    if (!field_is_required((*m_iter)) && (!nullable_ || field_has_default((*m_iter)))) {
-      indent(out) << "private " << declare_field(*m_iter, false, "_") << endl;
-    }
-  }
-  out << endl;
-
-  bool has_non_required_fields = false;
-  bool has_non_required_default_value_fields = false;
-  bool has_required_fields = false;
-  for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-    generate_csharp_doc(out, *m_iter);
-    generate_property(out, *m_iter, true, true);
-    bool is_required = field_is_required((*m_iter));
-    bool has_default = field_has_default((*m_iter));
-    if (is_required) {
-      has_required_fields = true;
-    } else {
-      if (has_default) {
-        has_non_required_default_value_fields = true;
-      }
-      has_non_required_fields = true;
-    }
-  }
-
-  bool generate_isset = (nullable_ && has_non_required_default_value_fields)
-                        || (!nullable_ && has_non_required_fields);
-  if (generate_isset) {
-    out << endl;
-    if (serialize_ || wcf_) {
-      out << indent() << "[XmlIgnore] // XmlSerializer" << endl << indent()
-          << "[DataMember(Order = 1)]  // XmlObjectSerializer, DataContractJsonSerializer, etc."
-          << endl;
-    }
-    out << indent() << "public Isset __isset;" << endl << indent() << "#if !SILVERLIGHT" << endl
-        << indent() << "[Serializable]" << endl << indent() << "#endif" << endl;
-    if (serialize_ || wcf_) {
-      indent(out) << "[DataContract]" << endl;
-    }
-    indent(out) << "public struct Isset {" << endl;
-    indent_up();
-    for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-      bool is_required = field_is_required((*m_iter));
-      bool has_default = field_has_default((*m_iter));
-      // if it is required, don't need Isset for that variable
-      // if it is not required, if it has a default value, we need to generate Isset
-      // if we are not nullable, then we generate Isset
-      if (!is_required && (!nullable_ || has_default)) {
-        if (serialize_ || wcf_) {
-          indent(out) << "[DataMember]" << endl;
-        }
-        indent(out) << "public bool " << normalize_name((*m_iter)->get_name()) << ";" << endl;
-      }
-    }
-
-    indent_down();
-    indent(out) << "}" << endl << endl;
-
-    if (generate_isset && (serialize_ || wcf_)) {
-      indent(out) << "#region XmlSerializer support" << endl << endl;
-
-      for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-        bool is_required = field_is_required((*m_iter));
-        bool has_default = field_has_default((*m_iter));
-        // if it is required, don't need Isset for that variable
-        // if it is not required, if it has a default value, we need to generate Isset
-        // if we are not nullable, then we generate Isset
-        if (!is_required && (!nullable_ || has_default)) {
-          indent(out) << "public bool ShouldSerialize" << prop_name((*m_iter)) << "()" << endl;
-          indent(out) << "{" << endl;
-          indent_up();
-          indent(out) << "return __isset." << normalize_name((*m_iter)->get_name()) << ";" << endl;
-          indent_down();
-          indent(out) << "}" << endl << endl;
-        }
-      }
-
-      indent(out) << "#endregion XmlSerializer support" << endl << endl;
-    }
-  }
-
-  // We always want a default, no argument constructor for Reading
-  indent(out) << "public " << normalize_name(tstruct->get_name()) << "() {" << endl;
-  indent_up();
-
-  for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-    t_type* t = (*m_iter)->get_type();
-    while (t->is_typedef()) {
-      t = ((t_typedef*)t)->get_type();
-    }
-    if ((*m_iter)->get_value() != NULL) {
-      if (field_is_required((*m_iter))) {
-        print_const_value(out, "this." + prop_name(*m_iter), t, (*m_iter)->get_value(), true, true);
-      } else {
-        print_const_value(out,
-                          "this._" + (*m_iter)->get_name(),
-                          t,
-                          (*m_iter)->get_value(),
-                          true,
-                          true);
-        // Optionals with defaults are marked set
-        indent(out) << "this.__isset." << normalize_name((*m_iter)->get_name()) << " = true;"
-                    << endl;
-      }
-    }
-  }
-  indent_down();
-  indent(out) << "}" << endl << endl;
-
-  if (has_required_fields) {
-    indent(out) << "public " << tstruct->get_name() << "(";
-    bool first = true;
-    for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-      if (field_is_required((*m_iter))) {
-        if (first) {
-          first = false;
-        } else {
-          out << ", ";
-        }
-        out << type_name((*m_iter)->get_type()) << " " << normalize_name((*m_iter)->get_name());
-      }
-    }
-    out << ") : this() {" << endl;
-    indent_up();
-
-    for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-      if (field_is_required((*m_iter))) {
-        indent(out) << "this." << prop_name((*m_iter)) << " = " << normalize_name((*m_iter)->get_name()) << ";"
-                    << endl;
-      }
-    }
-
-    indent_down();
-    indent(out) << "}" << endl << endl;
-  }
-
-  generate_csharp_struct_reader(out, tstruct);
-  if (is_result) {
-    generate_csharp_struct_result_writer(out, tstruct);
-  } else {
-    generate_csharp_struct_writer(out, tstruct);
-  }
-  if (hashcode_) {
-    generate_csharp_struct_equals(out, tstruct);
-    generate_csharp_struct_hashcode(out, tstruct);
-  }
-  generate_csharp_struct_tostring(out, tstruct);
-  scope_down(out);
-  out << endl;
-
-  // generate a corresponding WCF fault to wrap the exception
-  if ((serialize_ || wcf_) && is_exception) {
-    generate_csharp_wcffault(out, tstruct);
-  }
-
-  cleanup_member_name_mapping(tstruct);
-  if (!in_class) {
-    end_csharp_namespace(out);
-  }
-}
-
-void t_csharp_generator::generate_csharp_wcffault(ostream& out, t_struct* tstruct) {
-  out << endl;
-  indent(out) << "#if !SILVERLIGHT" << endl;
-  indent(out) << "[Serializable]" << endl;
-  indent(out) << "#endif" << endl;
-  indent(out) << "[DataContract]" << endl;
-  bool is_final = (tstruct->annotations_.find("final") != tstruct->annotations_.end());
-
-  indent(out) << "public " << (is_final ? "sealed " : "") << "partial class " << tstruct->get_name()
-              << "Fault" << endl;
-
-  scope_up(out);
-
-  const vector<t_field*>& members = tstruct->get_members();
-  vector<t_field*>::const_iterator m_iter;
-
-  // make private members with public Properties
-  for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-    // if the field is requied, then we use auto-properties
-    if (!field_is_required((*m_iter)) && (!nullable_ || field_has_default((*m_iter)))) {
-      indent(out) << "private " << declare_field(*m_iter, false, "_") << endl;
-    }
-  }
-  out << endl;
-
-  for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-    generate_property(out, *m_iter, true, false);
-  }
-
-  scope_down(out);
-  out << endl;
-}
-
-void t_csharp_generator::generate_csharp_struct_reader(ostream& out, t_struct* tstruct) {
-  indent(out) << "public void Read (TProtocol iprot)" << endl;
-  scope_up(out);
-
-  out << indent() << "iprot.IncrementRecursionDepth();" << endl;
-  out << indent() << "try" << endl;
-  scope_up(out);
-
-  const vector<t_field*>& fields = tstruct->get_members();
-  vector<t_field*>::const_iterator f_iter;
-
-  // Required variables aren't in __isset, so we need tmp vars to check them
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    if (field_is_required((*f_iter))) {
-      indent(out) << "bool isset_" << (*f_iter)->get_name() << " = false;" << endl;
-    }
-  }
-
-  indent(out) << "TField field;" << endl << indent() << "iprot.ReadStructBegin();" << endl;
-
-  indent(out) << "while (true)" << endl;
-  scope_up(out);
-
-  indent(out) << "field = iprot.ReadFieldBegin();" << endl;
-
-  indent(out) << "if (field.Type == TType.Stop) { " << endl;
-  indent_up();
-  indent(out) << "break;" << endl;
-  indent_down();
-  indent(out) << "}" << endl;
-
-  indent(out) << "switch (field.ID)" << endl;
-
-  scope_up(out);
-
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    bool is_required = field_is_required((*f_iter));
-    indent(out) << "case " << (*f_iter)->get_key() << ":" << endl;
-    indent_up();
-    indent(out) << "if (field.Type == " << type_to_enum((*f_iter)->get_type()) << ") {" << endl;
-    indent_up();
-
-    generate_deserialize_field(out, *f_iter);
-    if (is_required) {
-      indent(out) << "isset_" << (*f_iter)->get_name() << " = true;" << endl;
-    }
-
-    indent_down();
-    out << indent() << "} else { " << endl << indent() << "  TProtocolUtil.Skip(iprot, field.Type);"
-        << endl << indent() << "}" << endl << indent() << "break;" << endl;
-    indent_down();
-  }
-
-  indent(out) << "default: " << endl;
-  indent_up();
-  indent(out) << "TProtocolUtil.Skip(iprot, field.Type);" << endl;
-  indent(out) << "break;" << endl;
-  indent_down();
-
-  scope_down(out);
-
-  indent(out) << "iprot.ReadFieldEnd();" << endl;
-
-  scope_down(out);
-
-  indent(out) << "iprot.ReadStructEnd();" << endl;
-
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    if (field_is_required((*f_iter))) {
-      indent(out) << "if (!isset_" << (*f_iter)->get_name() << ")" << endl;
-      indent_up();
-      out << indent()
-          << "throw new TProtocolException(TProtocolException.INVALID_DATA, "
-          << "\"required field " << prop_name((*f_iter)) << " not set\");"
-          << endl;
-      indent_down();
-    }
-  }
-
-  scope_down(out);
-  out << indent() << "finally" << endl;
-  scope_up(out);
-  out << indent() << "iprot.DecrementRecursionDepth();" << endl;
-  scope_down(out);
-
-  indent_down();
-
-  indent(out) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_csharp_struct_writer(ostream& out, t_struct* tstruct) {
-  out << indent() << "public void Write(TProtocol oprot) {" << endl;
-  indent_up();
-
-  out << indent() << "oprot.IncrementRecursionDepth();" << endl;
-  out << indent() << "try" << endl;
-  scope_up(out);
-
-  string name = tstruct->get_name();
-  const vector<t_field*>& fields = tstruct->get_sorted_members();
-  vector<t_field*>::const_iterator f_iter;
-
-  indent(out) << "TStruct struc = new TStruct(\"" << name << "\");" << endl;
-  indent(out) << "oprot.WriteStructBegin(struc);" << endl;
-
-  if (fields.size() > 0) {
-    indent(out) << "TField field = new TField();" << endl;
-    for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-      bool is_required = field_is_required((*f_iter));
-      bool has_default = field_has_default((*f_iter));
-      bool null_allowed = type_can_be_null((*f_iter)->get_type());
-
-      if (is_required)
-      {
-        if (null_allowed) {
-          indent(out) << "if (" << prop_name((*f_iter)) << " == null)" << endl;
-          indent_up();
-          out << indent()
-              << "throw new TProtocolException(TProtocolException.INVALID_DATA, "
-              << "\"required field " << prop_name((*f_iter)) << " not set\");"
-              << endl;
-          indent_down();
-        }
-      }
-      else
-      {
-        if (nullable_ && !has_default) {
-            indent(out) << "if (" << prop_name((*f_iter)) << " != null) {" << endl;
-        }
-        else if (null_allowed) {
-          out << indent()
-              << "if (" << prop_name((*f_iter)) << " != null && __isset."
-              << normalize_name((*f_iter)->get_name()) << ") {"
-              << endl;
-        }
-        else {
-           indent(out) << "if (__isset." << normalize_name((*f_iter)->get_name()) << ") {" << endl;
-        }
-        indent_up();
-      }
-      indent(out) << "field.Name = \"" << (*f_iter)->get_name() << "\";" << endl;
-      indent(out) << "field.Type = " << type_to_enum((*f_iter)->get_type()) << ";" << endl;
-      indent(out) << "field.ID = " << (*f_iter)->get_key() << ";" << endl;
-      indent(out) << "oprot.WriteFieldBegin(field);" << endl;
-
-      generate_serialize_field(out, *f_iter);
-
-      indent(out) << "oprot.WriteFieldEnd();" << endl;
-      if (!is_required) {
-        indent_down();
-        indent(out) << "}" << endl;
-      }
-    }
-  }
-
-  indent(out) << "oprot.WriteFieldStop();" << endl;
-  indent(out) << "oprot.WriteStructEnd();" << endl;
-
-  scope_down(out);
-  out << indent() << "finally" << endl;
-  scope_up(out);
-  out << indent() << "oprot.DecrementRecursionDepth();" << endl;
-  scope_down(out);
-
-  indent_down();
-
-  indent(out) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_csharp_struct_result_writer(ostream& out, t_struct* tstruct) {
-  indent(out) << "public void Write(TProtocol oprot) {" << endl;
-  indent_up();
-
-  out << indent() << "oprot.IncrementRecursionDepth();" << endl;
-  out << indent() << "try" << endl;
-  scope_up(out);
-
-  string name = tstruct->get_name();
-  const vector<t_field*>& fields = tstruct->get_sorted_members();
-  vector<t_field*>::const_iterator f_iter;
-
-  indent(out) << "TStruct struc = new TStruct(\"" << name << "\");" << endl;
-  indent(out) << "oprot.WriteStructBegin(struc);" << endl;
-
-  if (fields.size() > 0) {
-    indent(out) << "TField field = new TField();" << endl;
-    bool first = true;
-    for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-      if (first) {
-        first = false;
-        out << endl << indent() << "if ";
-      } else {
-        out << " else if ";
-      }
-
-      if (nullable_) {
-        out << "(this." << prop_name((*f_iter)) << " != null) {" << endl;
-      } else {
-        out << "(this.__isset." << normalize_name((*f_iter)->get_name()) << ") {" << endl;
-      }
-      indent_up();
-
-      bool null_allowed = !nullable_ && type_can_be_null((*f_iter)->get_type());
-      if (null_allowed) {
-        indent(out) << "if (" << prop_name(*f_iter) << " != null) {" << endl;
-        indent_up();
-      }
-
-      indent(out) << "field.Name = \"" << prop_name(*f_iter) << "\";" << endl;
-      indent(out) << "field.Type = " << type_to_enum((*f_iter)->get_type()) << ";" << endl;
-      indent(out) << "field.ID = " << (*f_iter)->get_key() << ";" << endl;
-      indent(out) << "oprot.WriteFieldBegin(field);" << endl;
-
-      generate_serialize_field(out, *f_iter);
-
-      indent(out) << "oprot.WriteFieldEnd();" << endl;
-
-      if (null_allowed) {
-        indent_down();
-        indent(out) << "}" << endl;
-      }
-
-      indent_down();
-      indent(out) << "}";
-    }
-  }
-
-  out << endl << indent() << "oprot.WriteFieldStop();" << endl << indent()
-      << "oprot.WriteStructEnd();" << endl;
-
-  scope_down(out);
-  out << indent() << "finally" << endl;
-  scope_up(out);
-  out << indent() << "oprot.DecrementRecursionDepth();" << endl;
-  scope_down(out);
-
-  indent_down();
-
-  indent(out) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_csharp_struct_tostring(ostream& out, t_struct* tstruct) {
-  indent(out) << "public override string ToString() {" << endl;
-  indent_up();
-
-  indent(out) << "StringBuilder __sb = new StringBuilder(\"" << tstruct->get_name() << "(\");"
-              << endl;
-
-  const vector<t_field*>& fields = tstruct->get_members();
-  vector<t_field*>::const_iterator f_iter;
-
-  bool useFirstFlag = false;
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    if (!field_is_required((*f_iter))) {
-      indent(out) << "bool __first = true;" << endl;
-      useFirstFlag = true;
-    }
-    break;
-  }
-
-  bool had_required = false; // set to true after first required field has been processed
-
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    bool is_required = field_is_required((*f_iter));
-    bool has_default = field_has_default((*f_iter));
-    if (nullable_ && !has_default && !is_required) {
-      indent(out) << "if (" << prop_name((*f_iter)) << " != null) {" << endl;
-      indent_up();
-    } else if (!is_required) {
-      bool null_allowed = type_can_be_null((*f_iter)->get_type());
-      if (null_allowed) {
-        indent(out) << "if (" << prop_name((*f_iter)) << " != null && __isset."
-                    << normalize_name((*f_iter)->get_name()) << ") {" << endl;
-        indent_up();
-      } else {
-        indent(out) << "if (__isset." << normalize_name((*f_iter)->get_name()) << ") {" << endl;
-        indent_up();
-      }
-    }
-
-    if (useFirstFlag && (!had_required)) {
-      indent(out) << "if(!__first) { __sb.Append(\", \"); }" << endl;
-      if (!is_required) {
-        indent(out) << "__first = false;" << endl;
-      }
-      indent(out) << "__sb.Append(\"" << prop_name((*f_iter)) << ": \");" << endl;
-    } else {
-      indent(out) << "__sb.Append(\", " << prop_name((*f_iter)) << ": \");" << endl;
-    }
-
-    t_type* ttype = (*f_iter)->get_type();
-    if (ttype->is_xception() || ttype->is_struct()) {
-      indent(out) << "__sb.Append(" << prop_name((*f_iter))
-                  << "== null ? \"<null>\" : " << prop_name((*f_iter)) << ".ToString());" << endl;
-    } else {
-      indent(out) << "__sb.Append(" << prop_name((*f_iter)) << ");" << endl;
-    }
-
-    if (!is_required) {
-      indent_down();
-      indent(out) << "}" << endl;
-    } else {
-      had_required = true; // now __first must be false, so we don't need to check it anymore
-    }
-  }
-
-  indent(out) << "__sb.Append(\")\");" << endl;
-  indent(out) << "return __sb.ToString();" << endl;
-
-  indent_down();
-  indent(out) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_csharp_union(t_struct* tunion) {
-  string f_union_name = namespace_dir_ + "/" + (tunion->get_name()) + ".cs";
-  ofstream_with_content_based_conditional_update f_union;
-
-  f_union.open(f_union_name.c_str());
-
-  f_union << autogen_comment() << csharp_type_usings() << csharp_thrift_usings() << endl;
-
-  generate_csharp_union_definition(f_union, tunion);
-
-  f_union.close();
-}
-
-void t_csharp_generator::generate_csharp_union_definition(std::ostream& out, t_struct* tunion) {
-  // Let's define the class first
-  start_csharp_namespace(out);
-
-  indent(out) << "public abstract partial class " << tunion->get_name() << " : TAbstractBase {"
-              << endl;
-
-  indent_up();
-
-  indent(out) << "public abstract void Write(TProtocol protocol);" << endl;
-  indent(out) << "public readonly int Isset;" << endl;
-  indent(out) << "public abstract object Data { get; }" << endl;
-
-  indent(out) << "protected " << tunion->get_name() << "(int isset) {" << endl;
-  indent_up();
-  indent(out) << "Isset = isset;" << endl;
-  indent_down();
-  indent(out) << "}" << endl << endl;
-
-  indent(out) << "public class ___undefined : " << tunion->get_name() << " {" << endl;
-  indent_up();
-
-  indent(out) << "public override object Data { get { return null; } }" << endl;
-
-  indent(out) << "public ___undefined() : base(0) {}" << endl << endl;
-
-  indent(out) << "public override void Write(TProtocol protocol) {" << endl;
-  indent_up();
-  indent(out) << "throw new TProtocolException( TProtocolException.INVALID_DATA, \"Cannot persist "
-                 "an union type which is not set.\");" << endl;
-  indent_down();
-  indent(out) << "}" << endl << endl;
-
-  indent_down();
-  indent(out) << "}" << endl << endl;
-
-  const vector<t_field*>& fields = tunion->get_members();
-  vector<t_field*>::const_iterator f_iter;
-
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    generate_csharp_union_class(out, tunion, (*f_iter));
-  }
-
-  generate_csharp_union_reader(out, tunion);
-
-  indent_down();
-  indent(out) << "}" << endl << endl;
-
-  end_csharp_namespace(out);
-}
-
-void t_csharp_generator::generate_csharp_union_class(std::ostream& out,
-                                                     t_struct* tunion,
-                                                     t_field* tfield) {
-  indent(out) << "public " << type_name(tfield->get_type()) << " As_" << tfield->get_name() << endl;
-  indent(out) << "{" << endl;
-  indent_up();
-  indent(out) << "get" << endl;
-  indent(out) << "{" << endl;
-  indent_up();
-  indent(out) << "return (" << tfield->get_key() << " == Isset) ? (" << type_name(tfield->get_type()) << ")Data : default(" << type_name(tfield->get_type()) << ");" << endl;
-  indent_down();
-  indent(out) << "}" << endl;
-  indent_down();
-  indent(out) << "}" << endl
-      << endl;
-	
-	
-  indent(out) << "public class " << tfield->get_name() << " : " << tunion->get_name() << " {"
-              << endl;
-  indent_up();
-  indent(out) << "private " << type_name(tfield->get_type()) << " _data;" << endl;
-  indent(out) << "public override object Data { get { return _data; } }" << endl;
-  indent(out) << "public " << tfield->get_name() << "(" << type_name(tfield->get_type())
-              << " data) : base("<< tfield->get_key() <<") {" << endl;
-  indent_up();
-  indent(out) << "this._data = data;" << endl;
-  indent_down();
-  indent(out) << "}" << endl;
-  indent(out) << "public override void Write(TProtocol oprot) {" << endl;
-  indent_up();
-
-  out << indent() << "oprot.IncrementRecursionDepth();" << endl;
-  out << indent() << "try" << endl;
-  scope_up(out);
-
-  indent(out) << "TStruct struc = new TStruct(\"" << tunion->get_name() << "\");" << endl;
-  indent(out) << "oprot.WriteStructBegin(struc);" << endl;
-
-  indent(out) << "TField field = new TField();" << endl;
-  indent(out) << "field.Name = \"" << tfield->get_name() << "\";" << endl;
-  indent(out) << "field.Type = " << type_to_enum(tfield->get_type()) << ";" << endl;
-  indent(out) << "field.ID = " << tfield->get_key() << ";" << endl;
-  indent(out) << "oprot.WriteFieldBegin(field);" << endl;
-
-  generate_serialize_field(out, tfield, "_data", true, true);
-
-  indent(out) << "oprot.WriteFieldEnd();" << endl;
-  indent(out) << "oprot.WriteFieldStop();" << endl;
-  indent(out) << "oprot.WriteStructEnd();" << endl;
-  indent_down();
-
-  scope_down(out);
-  out << indent() << "finally" << endl;
-  scope_up(out);
-  out << indent() << "oprot.DecrementRecursionDepth();" << endl;
-  scope_down(out);
-
-  indent(out) << "}" << endl;
-
-  indent_down();
-  indent(out) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_csharp_struct_equals(ostream& out, t_struct* tstruct) {
-  indent(out) << "public override bool Equals(object that) {" << endl;
-  indent_up();
-
-  indent(out) << "var other = that as " << type_name(tstruct) << ";" << endl;
-  indent(out) << "if (other == null) return false;" << endl;
-  indent(out) << "if (ReferenceEquals(this, other)) return true;" << endl;
-
-  const vector<t_field*>& fields = tstruct->get_members();
-  vector<t_field*>::const_iterator f_iter;
-
-  bool first = true;
-
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    if (first) {
-      first = false;
-      indent(out) << "return ";
-      indent_up();
-    } else {
-      out << endl;
-      indent(out) << "&& ";
-    }
-    if (!field_is_required((*f_iter)) && !(nullable_ && !field_has_default((*f_iter)))) {
-      out << "((__isset." << normalize_name((*f_iter)->get_name()) << " == other.__isset."
-          << normalize_name((*f_iter)->get_name()) << ") && ((!__isset."
-          << normalize_name((*f_iter)->get_name()) << ") || (";
-    }
-    t_type* ttype = (*f_iter)->get_type();
-    if (ttype->is_container() || ttype->is_binary()) {
-      out << "TCollections.Equals(";
-    } else {
-      out << "System.Object.Equals(";
-    }
-    out << prop_name((*f_iter)) << ", other." << prop_name((*f_iter)) << ")";
-    if (!field_is_required((*f_iter)) && !(nullable_ && !field_has_default((*f_iter)))) {
-      out << ")))";
-    }
-  }
-  if (first) {
-    indent(out) << "return true;" << endl;
-  } else {
-    out << ";" << endl;
-    indent_down();
-  }
-
-  indent_down();
-  indent(out) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_csharp_struct_hashcode(ostream& out, t_struct* tstruct) {
-  indent(out) << "public override int GetHashCode() {" << endl;
-  indent_up();
-
-  indent(out) << "int hashcode = 0;" << endl;
-  indent(out) << "unchecked {" << endl;
-  indent_up();
-
-  const vector<t_field*>& fields = tstruct->get_members();
-  vector<t_field*>::const_iterator f_iter;
-
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    t_type* ttype = (*f_iter)->get_type();
-    indent(out) << "hashcode = (hashcode * 397) ^ ";
-    if (field_is_required((*f_iter))) {
-      out << "(";
-    } else if (nullable_) {
-      out << "(" << prop_name((*f_iter)) << " == null ? 0 : ";
-    } else {
-      out << "(!__isset." << normalize_name((*f_iter)->get_name()) << " ? 0 : ";
-    }
-    if (ttype->is_container()) {
-      out << "(TCollections.GetHashCode(" << prop_name((*f_iter)) << "))";
-    } else {
-      out << "(" << prop_name((*f_iter)) << ".GetHashCode())";
-    }
-    out << ");" << endl;
-  }
-
-  indent_down();
-  indent(out) << "}" << endl;
-  indent(out) << "return hashcode;" << endl;
-
-  indent_down();
-  indent(out) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_service(t_service* tservice) {
-  string f_service_name = namespace_dir_ + "/" + service_name_ + ".cs";
-  f_service_.open(f_service_name.c_str());
-
-  f_service_ << autogen_comment() << csharp_type_usings() << csharp_thrift_usings() << endl;
-
-  start_csharp_namespace(f_service_);
-
-  indent(f_service_) << "public partial class " << normalize_name(service_name_) << " {" << endl;
-  indent_up();
-
-  generate_service_interface(tservice);
-  generate_service_client(tservice);
-  generate_service_server(tservice);
-  generate_service_helpers(tservice);
-
-  indent_down();
-
-  indent(f_service_) << "}" << endl;
-  end_csharp_namespace(f_service_);
-  f_service_.close();
-}
-
-void t_csharp_generator::generate_service_interface(t_service* tservice) {
-  generate_separate_service_interfaces(tservice);
-}
-
-void t_csharp_generator::generate_separate_service_interfaces(t_service* tservice) {
-  generate_sync_service_interface(tservice);
-
-  if (async_) {
-    generate_async_service_interface(tservice);
-  }
-
-  generate_combined_service_interface(tservice);
-}
-
-void t_csharp_generator::generate_sync_service_interface(t_service* tservice) {
-  string extends = "";
-  string extends_iface = "";
-  if (tservice->get_extends() != NULL) {
-    extends = type_name(tservice->get_extends());
-    extends_iface = " : " + extends + ".ISync";
-  }
-
-  generate_csharp_doc(f_service_, tservice);
-
-  if (wcf_) {
-    indent(f_service_) << "[System.ServiceModel.ServiceContract(Namespace=\"" << wcf_namespace_ << "\")]" << endl;
-  }
-  indent(f_service_) << "public interface ISync" << extends_iface << " {" << endl;
-
-  indent_up();
-  vector<t_function*> functions = tservice->get_functions();
-  vector<t_function*>::iterator f_iter;
-  for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    generate_csharp_doc(f_service_, *f_iter);
-
-    // if we're using WCF, add the corresponding attributes
-    if (wcf_) {
-      indent(f_service_) << "[System.ServiceModel.OperationContract]" << endl;
-
-      const std::vector<t_field*>& xceptions = (*f_iter)->get_xceptions()->get_members();
-      vector<t_field*>::const_iterator x_iter;
-      for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
-        indent(f_service_) << "[System.ServiceModel.FaultContract(typeof("
-          + type_name((*x_iter)->get_type(), false, false) + "Fault))]" << endl;
-      }
-    }
-
-    indent(f_service_) << function_signature(*f_iter) << ";" << endl;
-  }
-  indent_down();
-  f_service_ << indent() << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_async_service_interface(t_service* tservice) {
-  string extends = "";
-  string extends_iface = "";
-  if (tservice->get_extends() != NULL) {
-    extends = type_name(tservice->get_extends());
-    extends_iface = " : " + extends + ".IAsync";
-  }
-
-  generate_csharp_doc(f_service_, tservice);
-
-  if (wcf_) {
-    indent(f_service_) << "[System.ServiceModel.ServiceContract(Namespace=\"" << wcf_namespace_ << "\")]" << endl;
-  }
-  indent(f_service_) << "public interface IAsync" << extends_iface << " {" << endl;
-
-  indent_up();
-  vector<t_function*> functions = tservice->get_functions();
-  vector<t_function*>::iterator f_iter;
-  for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    generate_csharp_doc(f_service_, *f_iter);
-
-    // if we're using WCF, add the corresponding attributes
-    if (wcf_) {
-      indent(f_service_) << "[System.ServiceModel.OperationContract]" << endl;
-
-      const std::vector<t_field*>& xceptions = (*f_iter)->get_xceptions()->get_members();
-      vector<t_field*>::const_iterator x_iter;
-      for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
-        indent(f_service_) << "[System.ServiceModel.FaultContract(typeof("
-          + type_name((*x_iter)->get_type(), false, false) + "Fault))]" << endl;
-      }
-    }
-
-    indent(f_service_) << function_signature_async(*f_iter) << ";" << endl;
-  }
-  indent_down();
-  f_service_ << indent() << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_combined_service_interface(t_service* tservice) {
-  string extends_iface = " : ISync";
-
-  if (async_) {
-    extends_iface += ", IAsync";
-  }
-
-  generate_csharp_doc(f_service_, tservice);
-
-  if (wcf_) {
-    indent(f_service_) << "[System.ServiceModel.ServiceContract(Namespace=\"" << wcf_namespace_ << "\")]" << endl;
-  }
-
-  indent(f_service_) << "public interface Iface" << extends_iface << " {" << endl;
-
-  indent_up();
-
-  // We need to generate extra old style async methods for silverlight. Since
-  // this isn't something you'd want to implement server-side, just put them into
-  // the main Iface interface.
-  generate_silverlight_async_methods(tservice);
-
-  indent_down();
-
-  f_service_ << indent() << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_silverlight_async_methods(t_service* tservice) {
-  vector<t_function*> functions = tservice->get_functions();
-  vector<t_function*>::iterator f_iter;
-  for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    generate_csharp_doc(f_service_, *f_iter);
-
-    // For backwards compatibility, include the Begin_, End_ methods if we're generating
-    // with the async flag. I'm not sure this is necessary, so someone with more knowledge
-    // can maybe remove these checks if they know it's safe.
-    if (!async_) {
-      indent(f_service_) << "#if SILVERLIGHT" << endl;
-    }
-
-    indent(f_service_) << function_signature_async_begin(*f_iter, "Begin_") << ";" << endl;
-    indent(f_service_) << function_signature_async_end(*f_iter, "End_") << ";" << endl;
-
-    if (!async_) {
-      indent(f_service_) << "#endif" << endl;
-    }
-  }
-}
-
-void t_csharp_generator::generate_service_helpers(t_service* tservice) {
-  vector<t_function*> functions = tservice->get_functions();
-  vector<t_function*>::iterator f_iter;
-
-  for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    t_struct* ts = (*f_iter)->get_arglist();
-    generate_csharp_struct_definition(f_service_, ts, false, true);
-    generate_function_helpers(*f_iter);
-  }
-}
-
-void t_csharp_generator::generate_service_client(t_service* tservice) {
-  string extends = "";
-  string extends_client = "";
-  if (tservice->get_extends() != NULL) {
-    extends = type_name(tservice->get_extends());
-    extends_client = extends + ".Client, ";
-  } else {
-    extends_client = "IDisposable, ";
-  }
-
-  generate_csharp_doc(f_service_, tservice);
-
-  indent(f_service_) << "public class Client : " << extends_client << "Iface {" << endl;
-  indent_up();
-  indent(f_service_) << "public Client(TProtocol prot) : this(prot, prot)" << endl;
-  scope_up(f_service_);
-  scope_down(f_service_);
-  f_service_ << endl;
-
-  indent(f_service_) << "public Client(TProtocol iprot, TProtocol oprot)";
-  if (!extends.empty()) {
-    f_service_ << " : base(iprot, oprot)";
-  }
-  f_service_ << endl;
-
-  scope_up(f_service_);
-  if (extends.empty()) {
-    f_service_ << indent() << "iprot_ = iprot;" << endl << indent() << "oprot_ = oprot;" << endl;
-  }
-  scope_down(f_service_);
-
-  f_service_ << endl;
-
-  if (extends.empty()) {
-    f_service_ << indent() << "protected TProtocol iprot_;" << endl << indent()
-               << "protected TProtocol oprot_;" << endl << indent() << "protected int seqid_;"
-               << endl << endl;
-
-    f_service_ << indent() << "public TProtocol InputProtocol" << endl;
-    scope_up(f_service_);
-    indent(f_service_) << "get { return iprot_; }" << endl;
-    scope_down(f_service_);
-
-    f_service_ << indent() << "public TProtocol OutputProtocol" << endl;
-    scope_up(f_service_);
-    indent(f_service_) << "get { return oprot_; }" << endl;
-    scope_down(f_service_);
-    f_service_ << endl << endl;
-
-    indent(f_service_) << "#region \" IDisposable Support \"" << endl;
-    indent(f_service_) << "private bool _IsDisposed;" << endl << endl;
-    indent(f_service_) << "// IDisposable" << endl;
-    indent(f_service_) << "public void Dispose()" << endl;
-    scope_up(f_service_);
-    indent(f_service_) << "Dispose(true);" << endl;
-    scope_down(f_service_);
-    indent(f_service_) << endl << endl;
-    indent(f_service_) << "protected virtual void Dispose(bool disposing)" << endl;
-    scope_up(f_service_);
-    indent(f_service_) << "if (!_IsDisposed)" << endl;
-    scope_up(f_service_);
-    indent(f_service_) << "if (disposing)" << endl;
-    scope_up(f_service_);
-    indent(f_service_) << "if (iprot_ != null)" << endl;
-    scope_up(f_service_);
-    indent(f_service_) << "((IDisposable)iprot_).Dispose();" << endl;
-    scope_down(f_service_);
-    indent(f_service_) << "if (oprot_ != null)" << endl;
-    scope_up(f_service_);
-    indent(f_service_) << "((IDisposable)oprot_).Dispose();" << endl;
-    scope_down(f_service_);
-    scope_down(f_service_);
-    scope_down(f_service_);
-    indent(f_service_) << "_IsDisposed = true;" << endl;
-    scope_down(f_service_);
-    indent(f_service_) << "#endregion" << endl;
-    f_service_ << endl << endl;
-  }
-
-  vector<t_function*> functions = tservice->get_functions();
-  vector<t_function*>::const_iterator f_iter;
-  for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    string funname = (*f_iter)->get_name();
-
-    indent(f_service_) << endl;
-
-    if (!async_) {
-      indent(f_service_) << "#if SILVERLIGHT" << endl;
-      indent(f_service_) << endl;
-    }
-    // Begin_
-    indent(f_service_) << "public " << function_signature_async_begin(*f_iter, "Begin_") << endl;
-    scope_up(f_service_);
-    indent(f_service_) << "return "
-                       << "send_" << funname << "(callback, state";
-
-    t_struct* arg_struct = (*f_iter)->get_arglist();
-    prepare_member_name_mapping(arg_struct);
-
-    const vector<t_field*>& fields = arg_struct->get_members();
-    vector<t_field*>::const_iterator fld_iter;
-    for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
-      f_service_ << ", ";
-      f_service_ << normalize_name((*fld_iter)->get_name());
-    }
-    f_service_ << ");" << endl;
-    scope_down(f_service_);
-    f_service_ << endl;
-
-    // End
-    indent(f_service_) << "public " << function_signature_async_end(*f_iter, "End_") << endl;
-    scope_up(f_service_);
-    indent(f_service_) << "oprot_.Transport.EndFlush(asyncResult);" << endl;
-    if (!(*f_iter)->is_oneway()) {
-      f_service_ << indent();
-      if (!(*f_iter)->get_returntype()->is_void()) {
-        f_service_ << "return ";
-      }
-      f_service_ << "recv_" << funname << "();" << endl;
-    }
-    scope_down(f_service_);
-    f_service_ << endl;
-
-    // async
-    bool first;
-    if (async_) {
-      indent(f_service_) << "public async " << function_signature_async(*f_iter, "") << endl;
-      scope_up(f_service_);
-
-      if (!(*f_iter)->get_returntype()->is_void()) {
-        indent(f_service_) << type_name((*f_iter)->get_returntype()) << " retval;" << endl;
-        indent(f_service_) << "retval = ";
-      } else {
-        indent(f_service_);
-      }
-      f_service_ << "await Task.Run(() =>" << endl;
-      scope_up(f_service_);
-      indent(f_service_);
-      if (!(*f_iter)->get_returntype()->is_void()) {
-        f_service_ << "return ";
-      }
-      f_service_ << funname << "(";
-      first = true;
-      for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
-        if (first) {
-          first = false;
-        } else {
-          f_service_ << ", ";
-        }
-        f_service_ << (*fld_iter)->get_name();
-      }
-      f_service_ << ");" << endl;
-      indent_down();
-      indent(f_service_) << "});" << endl;
-      if (!(*f_iter)->get_returntype()->is_void()) {
-        indent(f_service_) << "return retval;" << endl;
-      }
-      scope_down(f_service_);
-      f_service_ << endl;
-    }
-
-    if (!async_) {
-      indent(f_service_) << "#endif" << endl << endl;
-    }
-
-    generate_csharp_doc(f_service_, *f_iter);
-    indent(f_service_) << "public " << function_signature(*f_iter) << endl;
-    scope_up(f_service_);
-
-    // silverlight invoke
-    if (!async_) {
-      indent(f_service_) << "#if SILVERLIGHT" << endl;
-
-      indent(f_service_) << "var asyncResult = Begin_" << funname << "(null, null";
-      for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
-        f_service_ << ", " << normalize_name((*fld_iter)->get_name());
-      }
-      f_service_ << ");" << endl;
-      
-      if (!(*f_iter)->is_oneway()) {
-        f_service_ << indent();
-        if (!(*f_iter)->get_returntype()->is_void()) {
-          f_service_ << "return ";
-        }
-        f_service_ << "End_" << funname << "(asyncResult);" << endl;
-      }
-      f_service_ << endl;
-
-      indent(f_service_) << "#else" << endl;
-    }
-
-    // synchronous invoke
-    indent(f_service_) << "send_" << funname << "(";
-  
-    first = true;
-    for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
-      if (first) {
-        first = false;
-      } else {
-        f_service_ << ", ";
-      }
-      f_service_ << normalize_name((*fld_iter)->get_name());
-    }
-    f_service_ << ");" << endl;
-  
-    if (!(*f_iter)->is_oneway()) {
-      f_service_ << indent();
-      if (!(*f_iter)->get_returntype()->is_void()) {
-        f_service_ << "return ";
-      }
-      f_service_ << "recv_" << funname << "();" << endl;
-    }
-    f_service_ << endl;
-
-    if (!async_) {
-      indent(f_service_) << "#endif" << endl;
-    }
-    scope_down(f_service_);
-
-    // Send
-    t_function send_function(g_type_void,
-                             string("send_") + (*f_iter)->get_name(),
-                             (*f_iter)->get_arglist());
-
-    string argsname = (*f_iter)->get_name() + "_args";
-
-    if (!async_) {
-      indent(f_service_) << "#if SILVERLIGHT" << endl;
-    }
-
-    indent(f_service_) << "public " << function_signature_async_begin(&send_function) << endl;
-    scope_up(f_service_);
-
-    f_service_ << indent() << "oprot_.WriteMessageBegin(new TMessage(\"" << funname << "\", "
-               << ((*f_iter)->is_oneway() ? "TMessageType.Oneway" : "TMessageType.Call")
-               << ", seqid_));" << endl << indent() << argsname << " args = new " << argsname
-               << "();" << endl;
-
-    for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
-      f_service_ << indent() << "args." << prop_name(*fld_iter) << " = "
-                 << normalize_name((*fld_iter)->get_name()) << ";" << endl;
-    }
-
-    f_service_ << indent() << "args.Write(oprot_);" << endl << indent()
-               << "oprot_.WriteMessageEnd();" << endl;
-    indent(f_service_) << "return oprot_.Transport.BeginFlush(callback, state);" << endl;
-      
-    scope_down(f_service_);
-    f_service_ << endl;
-
-    if (!async_) {
-      indent(f_service_) << "#else" << endl;
-      f_service_ << endl;
-    }
-
-    indent(f_service_) << "public " << function_signature(&send_function) << endl;
-    scope_up(f_service_);
-
-    f_service_ << indent() << "oprot_.WriteMessageBegin(new TMessage(\"" << funname << "\", "
-               << ((*f_iter)->is_oneway() ? "TMessageType.Oneway" : "TMessageType.Call")
-               << ", seqid_));" << endl << indent() << argsname << " args = new " << argsname
-               << "();" << endl;
-
-    for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
-      f_service_ << indent() << "args." << prop_name(*fld_iter) << " = "
-                 << normalize_name((*fld_iter)->get_name()) << ";" << endl;
-    }
-
-    f_service_ << indent() << "args.Write(oprot_);" << endl << indent()
-               << "oprot_.WriteMessageEnd();" << endl;
-
-    indent(f_service_) << "oprot_.Transport.Flush();" << endl;
-    cleanup_member_name_mapping(arg_struct);
-    scope_down(f_service_);
-
-    if (!async_) {
-      indent(f_service_) << "#endif" << endl;
-    }
-
-    f_service_ << endl;
-
-    if (!(*f_iter)->is_oneway()) {
-      string resultname = (*f_iter)->get_name() + "_result";
-
-      t_struct noargs(program_);
-      t_function recv_function((*f_iter)->get_returntype(),
-                               string("recv_") + (*f_iter)->get_name(),
-                               &noargs,
-                               (*f_iter)->get_xceptions());
-      indent(f_service_) << "public " << function_signature(&recv_function) << endl;
-      scope_up(f_service_);
-
-      t_struct* xs = (*f_iter)->get_xceptions();
-      prepare_member_name_mapping(xs, xs->get_members(), resultname);
-
-      f_service_ << indent() << "TMessage msg = iprot_.ReadMessageBegin();" << endl << indent()
-                 << "if (msg.Type == TMessageType.Exception) {" << endl;
-      indent_up();
-      f_service_ << indent() << "TApplicationException x = TApplicationException.Read(iprot_);"
-                 << endl << indent() << "iprot_.ReadMessageEnd();" << endl << indent() << "throw x;"
-                 << endl;
-      indent_down();
-      f_service_ << indent() << "}" << endl << indent() << resultname << " result = new "
-                 << resultname << "();" << endl << indent() << "result.Read(iprot_);" << endl
-                 << indent() << "iprot_.ReadMessageEnd();" << endl;
-
-      if (!(*f_iter)->get_returntype()->is_void()) {
-        if (nullable_) {
-          if (type_can_be_null((*f_iter)->get_returntype())) {
-            f_service_ << indent() << "if (result.Success != null) {" << endl << indent()
-                       << "  return result.Success;" << endl << indent() << "}" << endl;
-          } else {
-            f_service_ << indent() << "if (result.Success.HasValue) {" << endl << indent()
-                       << "  return result.Success.Value;" << endl << indent() << "}" << endl;
-          }
-        } else {
-          f_service_ << indent() << "if (result.__isset.success) {" << endl << indent()
-                     << "  return result.Success;" << endl << indent() << "}" << endl;
-        }
-      }
-
-      const std::vector<t_field*>& xceptions = xs->get_members();
-      vector<t_field*>::const_iterator x_iter;
-      for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
-        if (nullable_) {
-          f_service_ << indent() << "if (result." << prop_name(*x_iter) << " != null) {" << endl
-                     << indent() << "  throw result." << prop_name(*x_iter) << ";" << endl
-                     << indent() << "}" << endl;
-        } else {
-          f_service_ << indent() << "if (result.__isset." << normalize_name((*x_iter)->get_name())
-                     << ") {" << endl << indent() << "  throw result." << prop_name(*x_iter) << ";"
-                     << endl << indent() << "}" << endl;
-        }
-      }
-
-      if ((*f_iter)->get_returntype()->is_void()) {
-        indent(f_service_) << "return;" << endl;
-      } else {
-        f_service_ << indent()
-                   << "throw new "
-                      "TApplicationException(TApplicationException.ExceptionType.MissingResult, \""
-                   << (*f_iter)->get_name() << " failed: unknown result\");" << endl;
-      }
-
-      cleanup_member_name_mapping((*f_iter)->get_xceptions());
-      scope_down(f_service_);
-      f_service_ << endl;
-    }
-  }
-
-  indent_down();
-  indent(f_service_) << "}" << endl;
-}
-
-void t_csharp_generator::generate_service_server(t_service* tservice) {
-  if (async_) {
-    generate_service_server_async(tservice);
-    generate_service_server_sync(tservice);
-  }
-  else {
-    generate_service_server_sync(tservice);
-  }
-}
-
-void t_csharp_generator::generate_service_server_sync(t_service* tservice) {
-  vector<t_function*> functions = tservice->get_functions();
-  vector<t_function*>::iterator f_iter;
-
-  string extends = "";
-  string extends_processor = "";
-  if (tservice->get_extends() != NULL) {
-    extends = type_name(tservice->get_extends());
-    extends_processor = extends + ".Processor, ";
-  }
-
-  indent(f_service_) << "public class Processor : " << extends_processor << "TProcessor {" << endl;
-  indent_up();
-
-  indent(f_service_) << "public Processor(ISync iface)";
-
-  if (!extends.empty()) {
-    f_service_ << " : base(iface)";
-  }
-  f_service_ << endl;
-  scope_up(f_service_);
-  f_service_ << indent() << "iface_ = iface;" << endl;
-
-  for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    f_service_ << indent() << "processMap_[\"" << (*f_iter)->get_name()
-      << "\"] = " << (*f_iter)->get_name() << "_Process;" << endl;
-  }
-
-  scope_down(f_service_);
-  f_service_ << endl;
-
-  if (extends.empty()) {
-    f_service_
-      << indent()
-      << "protected delegate void ProcessFunction(int seqid, TProtocol iprot, TProtocol oprot);"
-      << endl;
-  }
-
-  f_service_ << indent() << "private ISync iface_;" << endl;
-
-  if (extends.empty()) {
-    f_service_ << indent() << "protected Dictionary<string, ProcessFunction> processMap_ = new "
-      "Dictionary<string, ProcessFunction>();" << endl;
-  }
-
-  f_service_ << endl;
-
-  if (extends.empty()) {
-    indent(f_service_) << "public bool Process(TProtocol iprot, TProtocol oprot)" << endl;
-  }
-  else {
-    indent(f_service_) << "public new bool Process(TProtocol iprot, TProtocol oprot)" << endl;
-  }
-  scope_up(f_service_);
-
-  f_service_ << indent() << "try" << endl;
-  scope_up(f_service_);
-
-  f_service_ << indent() << "TMessage msg = iprot.ReadMessageBegin();" << endl;
-
-  f_service_
-    << indent() << "ProcessFunction fn;" << endl << indent()
-    << "processMap_.TryGetValue(msg.Name, out fn);" << endl << indent() << "if (fn == null) {"
-    << endl << indent() << "  TProtocolUtil.Skip(iprot, TType.Struct);" << endl << indent()
-    << "  iprot.ReadMessageEnd();" << endl << indent()
-    << "  TApplicationException x = new TApplicationException "
-    "(TApplicationException.ExceptionType.UnknownMethod, \"Invalid method name: '\" + "
-    "msg.Name + \"'\");" << endl << indent()
-    << "  oprot.WriteMessageBegin(new TMessage(msg.Name, TMessageType.Exception, msg.SeqID));"
-    << endl << indent() << "  x.Write(oprot);" << endl << indent() << "  oprot.WriteMessageEnd();"
-    << endl << indent() << "  oprot.Transport.Flush();" << endl << indent() << "  return true;"
-    << endl << indent() << "}" << endl << indent() << "fn(msg.SeqID, iprot, oprot);" << endl;
-
-  scope_down(f_service_);
-
-  f_service_ << indent() << "catch (IOException)" << endl;
-  scope_up(f_service_);
-  f_service_ << indent() << "return false;" << endl;
-  scope_down(f_service_);
-
-  f_service_ << indent() << "return true;" << endl;
-
-  scope_down(f_service_);
-  f_service_ << endl;
-
-  for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    generate_process_function(tservice, *f_iter);
-  }
-
-  indent_down();
-  indent(f_service_) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_service_server_async(t_service* tservice) {
-  vector<t_function*> functions = tservice->get_functions();
-  vector<t_function*>::iterator f_iter;
-
-  string extends = "";
-  string extends_processor = "";
-  if (tservice->get_extends() != NULL) {
-    extends = type_name(tservice->get_extends());
-    extends_processor = extends + ".AsyncProcessor, ";
-  }
-
-  indent(f_service_) << "public class AsyncProcessor : " << extends_processor << "TAsyncProcessor {" << endl;
-  indent_up();
-
-  indent(f_service_) << "public AsyncProcessor(IAsync iface)";
-  if (!extends.empty()) {
-    f_service_ << " : base(iface)";
-  }
-  f_service_ << endl;
-  scope_up(f_service_);
-  f_service_ << indent() << "iface_ = iface;" << endl;
-
-  for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    f_service_ << indent() << "processMap_[\"" << (*f_iter)->get_name()
-      << "\"] = " << (*f_iter)->get_name() << "_ProcessAsync;" << endl;
-  }
-
-  scope_down(f_service_);
-  f_service_ << endl;
-
-  if (extends.empty()) {
-    f_service_
-      << indent()
-      << "protected delegate Task ProcessFunction(int seqid, TProtocol iprot, TProtocol oprot);"
-      << endl;
-  }
-
-  f_service_ << indent() << "private IAsync iface_;" << endl;
-
-  if (extends.empty()) {
-    f_service_ << indent() << "protected Dictionary<string, ProcessFunction> processMap_ = new "
-      "Dictionary<string, ProcessFunction>();" << endl;
-  }
-
-  f_service_ << endl;
-
-  if (extends.empty()) {
-    indent(f_service_) << "public async Task<bool> ProcessAsync(TProtocol iprot, TProtocol oprot)" << endl;
-  }
-  else {
-    indent(f_service_) << "public new async Task<bool> ProcessAsync(TProtocol iprot, TProtocol oprot)" << endl;
-  }
-  scope_up(f_service_);
-
-  f_service_ << indent() << "try" << endl;
-  scope_up(f_service_);
-
-  f_service_ << indent() << "TMessage msg = iprot.ReadMessageBegin();" << endl;
-
-  f_service_
-    << indent() << "ProcessFunction fn;" << endl << indent()
-    << "processMap_.TryGetValue(msg.Name, out fn);" << endl << indent() << "if (fn == null) {"
-    << endl << indent() << "  TProtocolUtil.Skip(iprot, TType.Struct);" << endl << indent()
-    << "  iprot.ReadMessageEnd();" << endl << indent()
-    << "  TApplicationException x = new TApplicationException "
-    "(TApplicationException.ExceptionType.UnknownMethod, \"Invalid method name: '\" + "
-    "msg.Name + \"'\");" << endl << indent()
-    << "  oprot.WriteMessageBegin(new TMessage(msg.Name, TMessageType.Exception, msg.SeqID));"
-    << endl << indent() << "  x.Write(oprot);" << endl << indent() << "  oprot.WriteMessageEnd();"
-    << endl << indent() << "  oprot.Transport.Flush();" << endl << indent() << "  return true;"
-    << endl << indent() << "}" << endl << indent() << "await fn(msg.SeqID, iprot, oprot);" << endl;
-
-  scope_down(f_service_);
-
-  f_service_ << indent() << "catch (IOException)" << endl;
-  scope_up(f_service_);
-  f_service_ << indent() << "return false;" << endl;
-  scope_down(f_service_);
-
-  f_service_ << indent() << "return true;" << endl;
-
-  scope_down(f_service_);
-  f_service_ << endl;
-
-  for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    generate_process_function_async(tservice, *f_iter);
-  }
-
-  indent_down();
-  indent(f_service_) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_function_helpers(t_function* tfunction) {
-  if (tfunction->is_oneway()) {
-    return;
-  }
-
-  t_struct result(program_, tfunction->get_name() + "_result");
-  t_field success(tfunction->get_returntype(), "success", 0);
-  if (!tfunction->get_returntype()->is_void()) {
-    result.append(&success);
-  }
-
-  t_struct* xs = tfunction->get_xceptions();
-  const vector<t_field*>& fields = xs->get_members();
-  vector<t_field*>::const_iterator f_iter;
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    result.append(*f_iter);
-  }
-
-  generate_csharp_struct_definition(f_service_, &result, false, true, true);
-}
-
-void t_csharp_generator::generate_process_function(t_service* tservice, t_function* tfunction) {
-  (void)tservice;
-  indent(f_service_) << "public void " << tfunction->get_name()
-                     << "_Process(int seqid, TProtocol iprot, TProtocol oprot)" << endl;
-  scope_up(f_service_);
-
-  string argsname = tfunction->get_name() + "_args";
-  string resultname = tfunction->get_name() + "_result";
-
-  f_service_ << indent() << argsname << " args = new " << argsname << "();" << endl
-             << indent() << "args.Read(iprot);" << endl
-             << indent() << "iprot.ReadMessageEnd();" << endl;
-
-  t_struct* xs = tfunction->get_xceptions();
-  const std::vector<t_field*>& xceptions = xs->get_members();
-  vector<t_field*>::const_iterator x_iter;
-
-  if (!tfunction->is_oneway()) {
-    f_service_ << indent() << resultname << " result = new " << resultname << "();" << endl;
-  }
-
-  f_service_ << indent() << "try" << endl
-             << indent() << "{" << endl;
-  indent_up();
-
-  if (xceptions.size() > 0) {
-    f_service_ << indent() << "try" << endl
-               << indent() << "{" << endl;
-    indent_up();
-  }
-
-  t_struct* arg_struct = tfunction->get_arglist();
-  const std::vector<t_field*>& fields = arg_struct->get_members();
-  vector<t_field*>::const_iterator f_iter;
-
-  f_service_ << indent();
-  if (!tfunction->is_oneway() && !tfunction->get_returntype()->is_void()) {
-    f_service_ << "result.Success = ";
-  }
-  f_service_ << "iface_." << normalize_name(tfunction->get_name()) << "(";
-  bool first = true;
-  prepare_member_name_mapping(arg_struct);
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    if (first) {
-      first = false;
-    } else {
-      f_service_ << ", ";
-    }
-    f_service_ << "args." << prop_name(*f_iter);
-    if (nullable_ && !type_can_be_null((*f_iter)->get_type())) {
-      f_service_ << ".Value";
-    }
-  }
-  cleanup_member_name_mapping(arg_struct);
-  f_service_ << ");" << endl;
-
-  prepare_member_name_mapping(xs, xs->get_members(), resultname);
-  if (xceptions.size() > 0) {
-    indent_down();
-    f_service_ << indent() << "}" << endl;
-    for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
-      f_service_ << indent() << "catch (" << type_name((*x_iter)->get_type(), false, false) << " "
-                 << (*x_iter)->get_name() << ")" << endl
-                 << indent() << "{" << endl;
-      if (!tfunction->is_oneway()) {
-        indent_up();
-        f_service_ << indent() << "result." << prop_name(*x_iter) << " = " << (*x_iter)->get_name()
-                   << ";" << endl;
-        indent_down();
-      }
-      f_service_ << indent() << "}" << endl;
-    }
-  }
-  if (!tfunction->is_oneway()) {
-    f_service_ << indent() << "oprot.WriteMessageBegin(new TMessage(\"" << tfunction->get_name()
-               << "\", TMessageType.Reply, seqid)); " << endl;
-    f_service_ << indent() << "result.Write(oprot);" << endl;
-  }
-  indent_down();
-
-  cleanup_member_name_mapping(xs);
-
-  f_service_ << indent() << "}" << endl
-             << indent() << "catch (TTransportException)" << endl
-             << indent() << "{" << endl
-             << indent() << "  throw;" << endl
-             << indent() << "}" << endl
-             << indent() << "catch (Exception ex)" << endl
-             << indent() << "{" << endl
-             << indent() << "  Console.Error.WriteLine(\"Error occurred in processor:\");" << endl
-             << indent() << "  Console.Error.WriteLine(ex.ToString());" << endl;
-
-  if (tfunction->is_oneway()) {
-    f_service_ << indent() << "}" << endl;
-  } else {
-    f_service_ << indent() << "  TApplicationException x = new TApplicationException" << indent()
-               << "(TApplicationException.ExceptionType.InternalError,\" Internal error.\");"
-               << endl
-               << indent() << "  oprot.WriteMessageBegin(new TMessage(\"" << tfunction->get_name()
-               << "\", TMessageType.Exception, seqid));" << endl
-               << indent() << "  x.Write(oprot);" << endl
-               << indent() << "}" << endl;
-    f_service_ << indent() << "oprot.WriteMessageEnd();" << endl
-               << indent() << "oprot.Transport.Flush();" << endl;
-  }
-
-  scope_down(f_service_);
-
-  f_service_ << endl;
-}
-
-void t_csharp_generator::generate_process_function_async(t_service* tservice, t_function* tfunction) {
-  (void)tservice;
-  indent(f_service_) << "public async Task " << tfunction->get_name()
-    << "_ProcessAsync(int seqid, TProtocol iprot, TProtocol oprot)" << endl;
-  scope_up(f_service_);
-
-  string argsname = tfunction->get_name() + "_args";
-  string resultname = tfunction->get_name() + "_result";
-
-  f_service_ << indent() << argsname << " args = new " << argsname << "();" << endl
-    << indent() << "args.Read(iprot);" << endl
-    << indent() << "iprot.ReadMessageEnd();" << endl;
-
-  t_struct* xs = tfunction->get_xceptions();
-  const std::vector<t_field*>& xceptions = xs->get_members();
-  vector<t_field*>::const_iterator x_iter;
-
-  if (!tfunction->is_oneway()) {
-    f_service_ << indent() << resultname << " result = new " << resultname << "();" << endl;
-  }
-
-  f_service_ << indent() << "try" << endl
-    << indent() << "{" << endl;
-  indent_up();
-
-  if (xceptions.size() > 0) {
-    f_service_ << indent() << "try" << endl
-      << indent() << "{" << endl;
-    indent_up();
-  }
-
-  t_struct* arg_struct = tfunction->get_arglist();
-  const std::vector<t_field*>& fields = arg_struct->get_members();
-  vector<t_field*>::const_iterator f_iter;
-
-  f_service_ << indent();
-  if (!tfunction->is_oneway() && !tfunction->get_returntype()->is_void()) {
-    f_service_ << "result.Success = ";
-  }
-  f_service_ << "await iface_." << normalize_name(tfunction->get_name()) << "Async(";
-  bool first = true;
-  prepare_member_name_mapping(arg_struct);
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    if (first) {
-      first = false;
-    }
-    else {
-      f_service_ << ", ";
-    }
-    f_service_ << "args." << prop_name(*f_iter);
-    if (nullable_ && !type_can_be_null((*f_iter)->get_type())) {
-      f_service_ << ".Value";
-    }
-  }
-  cleanup_member_name_mapping(arg_struct);
-  f_service_ << ");" << endl;
-
-  prepare_member_name_mapping(xs, xs->get_members(), resultname);
-  if (xceptions.size() > 0) {
-    indent_down();
-    f_service_ << indent() << "}" << endl;
-    for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
-      f_service_ << indent() << "catch (" << type_name((*x_iter)->get_type(), false, false) << " "
-        << (*x_iter)->get_name() << ")" << endl
-        << indent() << "{" << endl;
-      if (!tfunction->is_oneway()) {
-        indent_up();
-        f_service_ << indent() << "result." << prop_name(*x_iter) << " = " << (*x_iter)->get_name()
-          << ";" << endl;
-        indent_down();
-      }
-      f_service_ << indent() << "}" << endl;
-    }
-  }
-  if (!tfunction->is_oneway()) {
-    f_service_ << indent() << "oprot.WriteMessageBegin(new TMessage(\"" << tfunction->get_name()
-      << "\", TMessageType.Reply, seqid)); " << endl;
-    f_service_ << indent() << "result.Write(oprot);" << endl;
-  }
-  indent_down();
-
-  cleanup_member_name_mapping(xs);
-
-  f_service_ << indent() << "}" << endl
-    << indent() << "catch (TTransportException)" << endl
-    << indent() << "{" << endl
-    << indent() << "  throw;" << endl
-    << indent() << "}" << endl
-    << indent() << "catch (Exception ex)" << endl
-    << indent() << "{" << endl
-    << indent() << "  Console.Error.WriteLine(\"Error occurred in processor:\");" << endl
-    << indent() << "  Console.Error.WriteLine(ex.ToString());" << endl;
-
-  if (tfunction->is_oneway()) {
-    f_service_ << indent() << "}" << endl;
-  }
-  else {
-    f_service_ << indent() << "  TApplicationException x = new TApplicationException" << indent()
-      << "(TApplicationException.ExceptionType.InternalError,\" Internal error.\");"
-      << endl
-      << indent() << "  oprot.WriteMessageBegin(new TMessage(\"" << tfunction->get_name()
-      << "\", TMessageType.Exception, seqid));" << endl
-      << indent() << "  x.Write(oprot);" << endl
-      << indent() << "}" << endl;
-    f_service_ << indent() << "oprot.WriteMessageEnd();" << endl
-      << indent() << "oprot.Transport.Flush();" << endl;
-  }
-
-  scope_down(f_service_);
-
-  f_service_ << endl;
-}
-
-void t_csharp_generator::generate_csharp_union_reader(std::ostream& out, t_struct* tunion) {
-  // Thanks to THRIFT-1768, we don't need to check for required fields in the union
-  const vector<t_field*>& fields = tunion->get_members();
-  vector<t_field*>::const_iterator f_iter;
-
-  indent(out) << "public static " << tunion->get_name() << " Read(TProtocol iprot)" << endl;
-  scope_up(out);
-
-  out << indent() << "iprot.IncrementRecursionDepth();" << endl;
-  out << indent() << "try" << endl;
-  scope_up(out);
-
-  indent(out) << tunion->get_name() << " retval;" << endl;
-  indent(out) << "iprot.ReadStructBegin();" << endl;
-  indent(out) << "TField field = iprot.ReadFieldBegin();" << endl;
-  // we cannot have the first field be a stop -- we must have a single field defined
-  indent(out) << "if (field.Type == TType.Stop)" << endl;
-  scope_up(out);
-  indent(out) << "iprot.ReadFieldEnd();" << endl;
-  indent(out) << "retval = new ___undefined();" << endl;
-  scope_down(out);
-  indent(out) << "else" << endl;
-  scope_up(out);
-  indent(out) << "switch (field.ID)" << endl;
-  scope_up(out);
-
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    indent(out) << "case " << (*f_iter)->get_key() << ":" << endl;
-    indent_up();
-    indent(out) << "if (field.Type == " << type_to_enum((*f_iter)->get_type()) << ") {" << endl;
-    indent_up();
-
-    indent(out) << type_name((*f_iter)->get_type()) << " temp;" << endl;
-    generate_deserialize_field(out, (*f_iter), "temp", true);
-    indent(out) << "retval = new " << (*f_iter)->get_name() << "(temp);" << endl;
-
-    indent_down();
-    out << indent() << "} else { " << endl << indent() << "  TProtocolUtil.Skip(iprot, field.Type);"
-        << endl << indent() << "  retval = new ___undefined();" << endl << indent() << "}" << endl
-        << indent() << "break;" << endl;
-    indent_down();
-  }
-
-  indent(out) << "default: " << endl;
-  indent_up();
-  indent(out) << "TProtocolUtil.Skip(iprot, field.Type);" << endl << indent()
-              << "retval = new ___undefined();" << endl;
-  indent(out) << "break;" << endl;
-  indent_down();
-
-  scope_down(out);
-
-  indent(out) << "iprot.ReadFieldEnd();" << endl;
-
-  indent(out) << "if (iprot.ReadFieldBegin().Type != TType.Stop)" << endl;
-  scope_up(out);
-  indent(out) << "throw new TProtocolException(TProtocolException.INVALID_DATA);" << endl;
-  scope_down(out);
-
-  // end of else for TStop
-  scope_down(out);
-  indent(out) << "iprot.ReadStructEnd();" << endl;
-  indent(out) << "return retval;" << endl;
-  indent_down();
-
-  scope_down(out);
-  out << indent() << "finally" << endl;
-  scope_up(out);
-  out << indent() << "iprot.DecrementRecursionDepth();" << endl;
-  scope_down(out);
-
-  indent(out) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_deserialize_field(ostream& out,
-                                                    t_field* tfield,
-                                                    string prefix,
-                                                    bool is_propertyless) {
-  t_type* type = tfield->get_type();
-  while (type->is_typedef()) {
-    type = ((t_typedef*)type)->get_type();
-  }
-
-  if (type->is_void()) {
-    throw "CANNOT GENERATE DESERIALIZE CODE FOR void TYPE: " + prefix + tfield->get_name();
-  }
-
-  string name = prefix + (is_propertyless ? "" : prop_name(tfield));
-
-  if (type->is_struct() || type->is_xception()) {
-    generate_deserialize_struct(out, (t_struct*)type, name);
-  } else if (type->is_container()) {
-    generate_deserialize_container(out, type, name);
-  } else if (type->is_base_type() || type->is_enum()) {
-    indent(out) << name << " = ";
-
-    if (type->is_enum()) {
-      out << "(" << type_name(type, false, true) << ")";
-    }
-
-    out << "iprot.";
-
-    if (type->is_base_type()) {
-      t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
-      switch (tbase) {
-      case t_base_type::TYPE_VOID:
-        throw "compiler error: cannot serialize void field in a struct: " + name;
-        break;
-      case t_base_type::TYPE_STRING:
-        if (type->is_binary()) {
-          out << "ReadBinary();";
-        } else {
-          out << "ReadString();";
-        }
-        break;
-      case t_base_type::TYPE_BOOL:
-        out << "ReadBool();";
-        break;
-      case t_base_type::TYPE_I8:
-        out << "ReadByte();";
-        break;
-      case t_base_type::TYPE_I16:
-        out << "ReadI16();";
-        break;
-      case t_base_type::TYPE_I32:
-        out << "ReadI32();";
-        break;
-      case t_base_type::TYPE_I64:
-        out << "ReadI64();";
-        break;
-      case t_base_type::TYPE_DOUBLE:
-        out << "ReadDouble();";
-        break;
-      default:
-        throw "compiler error: no C# name for base type " + t_base_type::t_base_name(tbase);
-      }
-    } else if (type->is_enum()) {
-      out << "ReadI32();";
-    }
-    out << endl;
-  } else {
-    printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n",
-           tfield->get_name().c_str(),
-           type_name(type).c_str());
-  }
-}
-
-void t_csharp_generator::generate_deserialize_struct(ostream& out,
-                                                     t_struct* tstruct,
-                                                     string prefix) {
-  if (union_ && tstruct->is_union()) {
-    out << indent() << prefix << " = " << type_name(tstruct) << ".Read(iprot);" << endl;
-  } else {
-    out << indent() << prefix << " = new " << type_name(tstruct) << "();" << endl << indent()
-        << prefix << ".Read(iprot);" << endl;
-  }
-}
-
-void t_csharp_generator::generate_deserialize_container(ostream& out,
-                                                        t_type* ttype,
-                                                        string prefix) {
-  scope_up(out);
-
-  string obj;
-
-  if (ttype->is_map()) {
-    obj = tmp("_map");
-  } else if (ttype->is_set()) {
-    obj = tmp("_set");
-  } else if (ttype->is_list()) {
-    obj = tmp("_list");
-  }
-
-  indent(out) << prefix << " = new " << type_name(ttype, false, true) << "();" << endl;
-  if (ttype->is_map()) {
-    out << indent() << "TMap " << obj << " = iprot.ReadMapBegin();" << endl;
-  } else if (ttype->is_set()) {
-    out << indent() << "TSet " << obj << " = iprot.ReadSetBegin();" << endl;
-  } else if (ttype->is_list()) {
-    out << indent() << "TList " << obj << " = iprot.ReadListBegin();" << endl;
-  }
-
-  string i = tmp("_i");
-  indent(out) << "for( int " << i << " = 0; " << i << " < " << obj << ".Count"
-              << "; "
-              << "++" << i << ")" << endl;
-  scope_up(out);
-
-  if (ttype->is_map()) {
-    generate_deserialize_map_element(out, (t_map*)ttype, prefix);
-  } else if (ttype->is_set()) {
-    generate_deserialize_set_element(out, (t_set*)ttype, prefix);
-  } else if (ttype->is_list()) {
-    generate_deserialize_list_element(out, (t_list*)ttype, prefix);
-  }
-
-  scope_down(out);
-
-  if (ttype->is_map()) {
-    indent(out) << "iprot.ReadMapEnd();" << endl;
-  } else if (ttype->is_set()) {
-    indent(out) << "iprot.ReadSetEnd();" << endl;
-  } else if (ttype->is_list()) {
-    indent(out) << "iprot.ReadListEnd();" << endl;
-  }
-
-  scope_down(out);
-}
-
-void t_csharp_generator::generate_deserialize_map_element(ostream& out,
-                                                          t_map* tmap,
-                                                          string prefix) {
-  string key = tmp("_key");
-  string val = tmp("_val");
-
-  t_field fkey(tmap->get_key_type(), key);
-  t_field fval(tmap->get_val_type(), val);
-
-  indent(out) << declare_field(&fkey) << endl;
-  indent(out) << declare_field(&fval) << endl;
-
-  generate_deserialize_field(out, &fkey);
-  generate_deserialize_field(out, &fval);
-
-  indent(out) << prefix << "[" << key << "] = " << val << ";" << endl;
-}
-
-void t_csharp_generator::generate_deserialize_set_element(ostream& out,
-                                                          t_set* tset,
-                                                          string prefix) {
-  string elem = tmp("_elem");
-  t_field felem(tset->get_elem_type(), elem);
-
-  indent(out) << declare_field(&felem) << endl;
-
-  generate_deserialize_field(out, &felem);
-
-  indent(out) << prefix << ".Add(" << elem << ");" << endl;
-}
-
-void t_csharp_generator::generate_deserialize_list_element(ostream& out,
-                                                           t_list* tlist,
-                                                           string prefix) {
-  string elem = tmp("_elem");
-  t_field felem(tlist->get_elem_type(), elem);
-
-  indent(out) << declare_field(&felem) << endl;
-
-  generate_deserialize_field(out, &felem);
-
-  indent(out) << prefix << ".Add(" << elem << ");" << endl;
-}
-
-void t_csharp_generator::generate_serialize_field(ostream& out,
-                                                  t_field* tfield,
-                                                  string prefix,
-                                                  bool is_element,
-                                                  bool is_propertyless) {
-  t_type* type = tfield->get_type();
-  while (type->is_typedef()) {
-    type = ((t_typedef*)type)->get_type();
-  }
-
-  string name = prefix + (is_propertyless ? "" : prop_name(tfield));
-
-  if (type->is_void()) {
-    throw "CANNOT GENERATE SERIALIZE CODE FOR void TYPE: " + name;
-  }
-
-  if (type->is_struct() || type->is_xception()) {
-    generate_serialize_struct(out, (t_struct*)type, name);
-  } else if (type->is_container()) {
-    generate_serialize_container(out, type, name);
-  } else if (type->is_base_type() || type->is_enum()) {
-    indent(out) << "oprot.";
-
-    string nullable_name = nullable_ && !is_element && !field_is_required(tfield) ? name + ".Value"
-                                                                                  : name;
-
-    if (type->is_base_type()) {
-      t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
-      switch (tbase) {
-      case t_base_type::TYPE_VOID:
-        throw "compiler error: cannot serialize void field in a struct: " + name;
-        break;
-      case t_base_type::TYPE_STRING:
-        if (type->is_binary()) {
-          out << "WriteBinary(";
-        } else {
-          out << "WriteString(";
-        }
-        out << name << ");";
-        break;
-      case t_base_type::TYPE_BOOL:
-        out << "WriteBool(" << nullable_name << ");";
-        break;
-      case t_base_type::TYPE_I8:
-        out << "WriteByte(" << nullable_name << ");";
-        break;
-      case t_base_type::TYPE_I16:
-        out << "WriteI16(" << nullable_name << ");";
-        break;
-      case t_base_type::TYPE_I32:
-        out << "WriteI32(" << nullable_name << ");";
-        break;
-      case t_base_type::TYPE_I64:
-        out << "WriteI64(" << nullable_name << ");";
-        break;
-      case t_base_type::TYPE_DOUBLE:
-        out << "WriteDouble(" << nullable_name << ");";
-        break;
-      default:
-        throw "compiler error: no C# name for base type " + t_base_type::t_base_name(tbase);
-      }
-    } else if (type->is_enum()) {
-      out << "WriteI32((int)" << nullable_name << ");";
-    }
-    out << endl;
-  } else {
-    printf("DO NOT KNOW HOW TO SERIALIZE '%s%s' TYPE '%s'\n",
-           prefix.c_str(),
-           tfield->get_name().c_str(),
-           type_name(type).c_str());
-  }
-}
-
-void t_csharp_generator::generate_serialize_struct(ostream& out,
-                                                   t_struct* tstruct,
-                                                   string prefix) {
-  (void)tstruct;
-  out << indent() << prefix << ".Write(oprot);" << endl;
-}
-
-void t_csharp_generator::generate_serialize_container(ostream& out, t_type* ttype, string prefix) {
-  scope_up(out);
-
-  if (ttype->is_map()) {
-    indent(out) << "oprot.WriteMapBegin(new TMap(" << type_to_enum(((t_map*)ttype)->get_key_type())
-                << ", " << type_to_enum(((t_map*)ttype)->get_val_type()) << ", " << prefix
-                << ".Count));" << endl;
-  } else if (ttype->is_set()) {
-    indent(out) << "oprot.WriteSetBegin(new TSet(" << type_to_enum(((t_set*)ttype)->get_elem_type())
-                << ", " << prefix << ".Count));" << endl;
-  } else if (ttype->is_list()) {
-    indent(out) << "oprot.WriteListBegin(new TList("
-                << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", " << prefix << ".Count));"
-                << endl;
-  }
-
-  string iter = tmp("_iter");
-  if (ttype->is_map()) {
-    indent(out) << "foreach (" << type_name(((t_map*)ttype)->get_key_type()) << " " << iter
-                << " in " << prefix << ".Keys)";
-  } else if (ttype->is_set()) {
-    indent(out) << "foreach (" << type_name(((t_set*)ttype)->get_elem_type()) << " " << iter
-                << " in " << prefix << ")";
-  } else if (ttype->is_list()) {
-    indent(out) << "foreach (" << type_name(((t_list*)ttype)->get_elem_type()) << " " << iter
-                << " in " << prefix << ")";
-  }
-
-  out << endl;
-  scope_up(out);
-
-  if (ttype->is_map()) {
-    generate_serialize_map_element(out, (t_map*)ttype, iter, prefix);
-  } else if (ttype->is_set()) {
-    generate_serialize_set_element(out, (t_set*)ttype, iter);
-  } else if (ttype->is_list()) {
-    generate_serialize_list_element(out, (t_list*)ttype, iter);
-  }
-
-  scope_down(out);
-
-  if (ttype->is_map()) {
-    indent(out) << "oprot.WriteMapEnd();" << endl;
-  } else if (ttype->is_set()) {
-    indent(out) << "oprot.WriteSetEnd();" << endl;
-  } else if (ttype->is_list()) {
-    indent(out) << "oprot.WriteListEnd();" << endl;
-  }
-
-  scope_down(out);
-}
-
-void t_csharp_generator::generate_serialize_map_element(ostream& out,
-                                                        t_map* tmap,
-                                                        string iter,
-                                                        string map) {
-  t_field kfield(tmap->get_key_type(), iter);
-  generate_serialize_field(out, &kfield, "", true);
-  t_field vfield(tmap->get_val_type(), map + "[" + iter + "]");
-  generate_serialize_field(out, &vfield, "", true);
-}
-
-void t_csharp_generator::generate_serialize_set_element(ostream& out, t_set* tset, string iter) {
-  t_field efield(tset->get_elem_type(), iter);
-  generate_serialize_field(out, &efield, "", true);
-}
-
-void t_csharp_generator::generate_serialize_list_element(ostream& out,
-                                                         t_list* tlist,
-                                                         string iter) {
-  t_field efield(tlist->get_elem_type(), iter);
-  generate_serialize_field(out, &efield, "", true);
-}
-
-void t_csharp_generator::generate_property(ostream& out,
-                                           t_field* tfield,
-                                           bool isPublic,
-                                           bool generateIsset) {
-  generate_csharp_property(out, tfield, isPublic, generateIsset, "_");
-}
-void t_csharp_generator::generate_csharp_property(ostream& out,
-                                                  t_field* tfield,
-                                                  bool isPublic,
-                                                  bool generateIsset,
-                                                  std::string fieldPrefix) {
-  if ((serialize_ || wcf_) && isPublic) {
-    indent(out) << "[DataMember(Order = 0)]" << endl;
-  }
-  bool has_default = field_has_default(tfield);
-  bool is_required = field_is_required(tfield);
-  if ((nullable_ && !has_default) || (is_required)) {
-    indent(out) << (isPublic ? "public " : "private ")
-                << type_name(tfield->get_type(), false, false, true, is_required) << " "
-                << prop_name(tfield) << " { get; set; }" << endl;
-  } else {
-    indent(out) << (isPublic ? "public " : "private ")
-                << type_name(tfield->get_type(), false, false, true) << " " << prop_name(tfield)
-                << endl;
-    scope_up(out);
-    indent(out) << "get" << endl;
-    scope_up(out);
-    bool use_nullable = false;
-    if (nullable_) {
-      t_type* ttype = tfield->get_type();
-      while (ttype->is_typedef()) {
-        ttype = ((t_typedef*)ttype)->get_type();
-      }
-      if (ttype->is_base_type()) {
-        use_nullable = ((t_base_type*)ttype)->get_base() != t_base_type::TYPE_STRING;
-      } else if (ttype->is_enum()) {
-        use_nullable = true;
-      }
-    }
-    indent(out) << "return " << fieldPrefix + tfield->get_name() << ";" << endl;
-    scope_down(out);
-    indent(out) << "set" << endl;
-    scope_up(out);
-    if (use_nullable) {
-      if (generateIsset) {
-        indent(out) << "__isset." << normalize_name(tfield->get_name()) << " = value.HasValue;"
-                    << endl;
-      }
-      indent(out) << "if (value.HasValue) this." << fieldPrefix + tfield->get_name()
-                  << " = value.Value;" << endl;
-    } else {
-      if (generateIsset) {
-        indent(out) << "__isset." << normalize_name(tfield->get_name()) << " = true;" << endl;
-      }
-      indent(out) << "this." << fieldPrefix + tfield->get_name() << " = value;" << endl;
-    }
-    scope_down(out);
-    scope_down(out);
-  }
-  out << endl;
-}
-
-std::string t_csharp_generator::make_valid_csharp_identifier(std::string const& fromName) {
-  std::string str = fromName;
-  if (str.empty()) {
-    return str;
-  }
-
-  // tests rely on this
-  assert(('A' < 'Z') && ('a' < 'z') && ('0' < '9'));
-
-  // if the first letter is a number, we add an additional underscore in front of it
-  char c = str.at(0);
-  if (('0' <= c) && (c <= '9')) {
-    str = "_" + str;
-  }
-
-  // following chars: letter, number or underscore
-  for (size_t i = 0; i < str.size(); ++i) {
-    c = str.at(i);
-    if ((('A' > c) || (c > 'Z')) && (('a' > c) || (c > 'z')) && (('0' > c) || (c > '9'))
-        && ('_' != c)) {
-      str.replace(i, 1, "_");
-    }
-  }
-
-  return str;
-}
-
-void t_csharp_generator::cleanup_member_name_mapping(void* scope) {
-  if( member_mapping_scopes.empty()) {
-    throw "internal error: cleanup_member_name_mapping() no scope active";
-  }
-
-  member_mapping_scope& active = member_mapping_scopes.back();
-  if (active.scope_member != scope) {
-    throw "internal error: cleanup_member_name_mapping() called for wrong struct";
-  }
-
-  member_mapping_scopes.pop_back();
-}
-
-string t_csharp_generator::get_mapped_member_name(string name) {
-  if( ! member_mapping_scopes.empty()) {
-    member_mapping_scope& active = member_mapping_scopes.back();
-    map<string, string>::iterator iter = active.mapping_table.find(name);
-    if (active.mapping_table.end() != iter) {
-      return iter->second;
-    }
-  }
-
-  pverbose("no mapping for member %s\n", name.c_str());
-  return name;
-}
-
-void t_csharp_generator::prepare_member_name_mapping(t_struct* tstruct) {
-  prepare_member_name_mapping(tstruct, tstruct->get_members(), tstruct->get_name());
-}
-
-void t_csharp_generator::prepare_member_name_mapping(void* scope,
-                                                     const vector<t_field*>& members,
-                                                     const string& structname) {
-  // begin new scope
-  member_mapping_scope dummy;
-  dummy.scope_member = 0;
-  member_mapping_scopes.push_back(dummy);
-  member_mapping_scope& active = member_mapping_scopes.back();
-  active.scope_member = scope;
-
-  // current C# generator policy:
-  // - prop names are always rendered with an Uppercase first letter
-  // - struct names are used as given
-  std::set<std::string> used_member_names;
-  vector<t_field*>::const_iterator iter;
-
-  // prevent name conflicts with struct (CS0542 error)
-  used_member_names.insert(structname);
-
-  // prevent name conflicts with known methods (THRIFT-2942)
-  used_member_names.insert("Read");
-  used_member_names.insert("Write");
-
-  for (iter = members.begin(); iter != members.end(); ++iter) {
-    string oldname = (*iter)->get_name();
-    string newname = prop_name(*iter, true);
-    while (true) {
-
-      // new name conflicts with another member
-      if (used_member_names.find(newname) != used_member_names.end()) {
-        pverbose("struct %s: member %s conflicts with another member\n",
-                 structname.c_str(),
-                 newname.c_str());
-        newname += '_';
-        continue;
-      }
-
-      // add always, this helps us to detect edge cases like
-      // different spellings ("foo" and "Foo") within the same struct
-      pverbose("struct %s: member mapping %s => %s\n",
-               structname.c_str(),
-               oldname.c_str(),
-               newname.c_str());
-      active.mapping_table[oldname] = newname;
-      used_member_names.insert(newname);
-      break;
-    }
-  }
-}
-
-std::string t_csharp_generator::prop_name(t_field* tfield, bool suppress_mapping) {
-  string name(tfield->get_name());
-  if (suppress_mapping) {
-    name[0] = toupper(name[0]);
-  } else {
-    name = get_mapped_member_name(name);
-  }
-  return name;
-}
-
-string t_csharp_generator::type_name(t_type* ttype,
-                                     bool in_container,
-                                     bool in_init,
-                                     bool in_param,
-                                     bool is_required) {
-  (void)in_init;
-  while (ttype->is_typedef()) {
-    ttype = ((t_typedef*)ttype)->get_type();
-  }
-
-  if (ttype->is_base_type()) {
-    return base_type_name((t_base_type*)ttype, in_container, in_param, is_required);
-  } else if (ttype->is_map()) {
-    t_map* tmap = (t_map*)ttype;
-    return "Dictionary<" + type_name(tmap->get_key_type(), true) + ", "
-           + type_name(tmap->get_val_type(), true) + ">";
-  } else if (ttype->is_set()) {
-    t_set* tset = (t_set*)ttype;
-    return "THashSet<" + type_name(tset->get_elem_type(), true) + ">";
-  } else if (ttype->is_list()) {
-    t_list* tlist = (t_list*)ttype;
-    return "List<" + type_name(tlist->get_elem_type(), true) + ">";
-  }
-
-  t_program* program = ttype->get_program();
-  string postfix = (!is_required && nullable_ && in_param && ttype->is_enum()) ? "?" : "";
-  if (program != NULL && program != program_) {
-    string ns = program->get_namespace("csharp");
-    if (!ns.empty()) {
-      return ns + "." + normalize_name(ttype->get_name()) + postfix;
-    }
-  }
-
-  return normalize_name(ttype->get_name()) + postfix;
-}
-
-string t_csharp_generator::base_type_name(t_base_type* tbase,
-                                          bool in_container,
-                                          bool in_param,
-                                          bool is_required) {
-  (void)in_container;
-  string postfix = (!is_required && nullable_ && in_param) ? "?" : "";
-  switch (tbase->get_base()) {
-  case t_base_type::TYPE_VOID:
-    return "void";
-  case t_base_type::TYPE_STRING:
-    if (tbase->is_binary()) {
-      return "byte[]";
-    } else {
-      return "string";
-    }
-  case t_base_type::TYPE_BOOL:
-    return "bool" + postfix;
-  case t_base_type::TYPE_I8:
-    return "sbyte" + postfix;
-  case t_base_type::TYPE_I16:
-    return "short" + postfix;
-  case t_base_type::TYPE_I32:
-    return "int" + postfix;
-  case t_base_type::TYPE_I64:
-    return "long" + postfix;
-  case t_base_type::TYPE_DOUBLE:
-    return "double" + postfix;
-  default:
-    throw "compiler error: no C# name for base type " + t_base_type::t_base_name(tbase->get_base());
-  }
-}
-
-string t_csharp_generator::declare_field(t_field* tfield, bool init, std::string prefix) {
-  string result = type_name(tfield->get_type()) + " " + prefix + tfield->get_name();
-  if (init) {
-    t_type* ttype = tfield->get_type();
-    while (ttype->is_typedef()) {
-      ttype = ((t_typedef*)ttype)->get_type();
-    }
-    if (ttype->is_base_type() && field_has_default(tfield)) {
-      std::ofstream dummy;
-      result += " = " + render_const_value(dummy, tfield->get_name(), ttype, tfield->get_value());
-    } else if (ttype->is_base_type()) {
-      t_base_type::t_base tbase = ((t_base_type*)ttype)->get_base();
-      switch (tbase) {
-      case t_base_type::TYPE_VOID:
-        throw "NO T_VOID CONSTRUCT";
-      case t_base_type::TYPE_STRING:
-        result += " = null";
-        break;
-      case t_base_type::TYPE_BOOL:
-        result += " = false";
-        break;
-      case t_base_type::TYPE_I8:
-      case t_base_type::TYPE_I16:
-      case t_base_type::TYPE_I32:
-      case t_base_type::TYPE_I64:
-        result += " = 0";
-        break;
-      case t_base_type::TYPE_DOUBLE:
-        result += " = (double)0";
-        break;
-      }
-    } else if (ttype->is_enum()) {
-      result += " = (" + type_name(ttype, false, true) + ")0";
-    } else if (ttype->is_container()) {
-      result += " = new " + type_name(ttype, false, true) + "()";
-    } else {
-      result += " = new " + type_name(ttype, false, true) + "()";
-    }
-  }
-  return result + ";";
-}
-
-string t_csharp_generator::function_signature(t_function* tfunction, string prefix) {
-  t_type* ttype = tfunction->get_returntype();
-  return type_name(ttype) + " " + normalize_name(prefix + tfunction->get_name()) + "("
-         + argument_list(tfunction->get_arglist()) + ")";
-}
-
-string t_csharp_generator::function_signature_async_begin(t_function* tfunction, string prefix) {
-  string comma = (tfunction->get_arglist()->get_members().size() > 0 ? ", " : "");
-  return "IAsyncResult " + normalize_name(prefix + tfunction->get_name())
-         + "(AsyncCallback callback, object state" + comma + argument_list(tfunction->get_arglist())
-         + ")";
-}
-
-string t_csharp_generator::function_signature_async_end(t_function* tfunction, string prefix) {
-  t_type* ttype = tfunction->get_returntype();
-  return type_name(ttype) + " " + normalize_name(prefix + tfunction->get_name())
-         + "(IAsyncResult asyncResult)";
-}
-
-string t_csharp_generator::function_signature_async(t_function* tfunction, string prefix) {
-  t_type* ttype = tfunction->get_returntype();
-  string task = "Task";
-  if (!ttype->is_void())
-    task += "<" + type_name(ttype) + ">";
-  return task + " " + normalize_name(prefix + tfunction->get_name()) + "Async("
-         + argument_list(tfunction->get_arglist()) + ")";
-}
-
-string t_csharp_generator::argument_list(t_struct* tstruct) {
-  string result = "";
-  const vector<t_field*>& fields = tstruct->get_members();
-  vector<t_field*>::const_iterator f_iter;
-  bool first = true;
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    if (first) {
-      first = false;
-    } else {
-      result += ", ";
-    }
-    result += type_name((*f_iter)->get_type()) + " " + normalize_name((*f_iter)->get_name());
-  }
-  return result;
-}
-
-string t_csharp_generator::type_to_enum(t_type* type) {
-  while (type->is_typedef()) {
-    type = ((t_typedef*)type)->get_type();
-  }
-
-  if (type->is_base_type()) {
-    t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
-    switch (tbase) {
-    case t_base_type::TYPE_VOID:
-      throw "NO T_VOID CONSTRUCT";
-    case t_base_type::TYPE_STRING:
-      return "TType.String";
-    case t_base_type::TYPE_BOOL:
-      return "TType.Bool";
-    case t_base_type::TYPE_I8:
-      return "TType.Byte";
-    case t_base_type::TYPE_I16:
-      return "TType.I16";
-    case t_base_type::TYPE_I32:
-      return "TType.I32";
-    case t_base_type::TYPE_I64:
-      return "TType.I64";
-    case t_base_type::TYPE_DOUBLE:
-      return "TType.Double";
-    }
-  } else if (type->is_enum()) {
-    return "TType.I32";
-  } else if (type->is_struct() || type->is_xception()) {
-    return "TType.Struct";
-  } else if (type->is_map()) {
-    return "TType.Map";
-  } else if (type->is_set()) {
-    return "TType.Set";
-  } else if (type->is_list()) {
-    return "TType.List";
-  }
-
-  throw "INVALID TYPE IN type_to_enum: " + type->get_name();
-}
-
-void t_csharp_generator::generate_csharp_docstring_comment(ostream& out, string contents) {
-  generate_docstring_comment(out, "/// <summary>\n", "/// ", contents, "/// </summary>\n");
-}
-
-void t_csharp_generator::generate_csharp_doc(ostream& out, t_field* field) {
-  if (field->get_type()->is_enum()) {
-    string combined_message = field->get_doc() + "\n<seealso cref=\""
-                              + get_enum_class_name(field->get_type()) + "\"/>";
-    generate_csharp_docstring_comment(out, combined_message);
-  } else {
-    generate_csharp_doc(out, (t_doc*)field);
-  }
-}
-
-void t_csharp_generator::generate_csharp_doc(ostream& out, t_doc* tdoc) {
-  if (tdoc->has_doc()) {
-    generate_csharp_docstring_comment(out, tdoc->get_doc());
-  }
-}
-
-void t_csharp_generator::generate_csharp_doc(ostream& out, t_function* tfunction) {
-  if (tfunction->has_doc()) {
-    stringstream ps;
-    const vector<t_field*>& fields = tfunction->get_arglist()->get_members();
-    vector<t_field*>::const_iterator p_iter;
-    for (p_iter = fields.begin(); p_iter != fields.end(); ++p_iter) {
-      t_field* p = *p_iter;
-      ps << "\n<param name=\"" << p->get_name() << "\">";
-      if (p->has_doc()) {
-        std::string str = p->get_doc();
-        str.erase(std::remove(str.begin(), str.end(), '\n'),
-                  str.end()); // remove the newlines that appear from the parser
-        ps << str;
-      }
-      ps << "</param>";
-    }
-    generate_docstring_comment(out,
-                               "",
-                               "/// ",
-                               "<summary>\n" + tfunction->get_doc() + "</summary>" + ps.str(),
-                               "");
-  }
-}
-
-std::string t_csharp_generator::get_enum_class_name(t_type* type) {
-  string package = "";
-  t_program* program = type->get_program();
-  if (program != NULL && program != program_) {
-    package = program->get_namespace("csharp") + ".";
-  }
-  return package + type->get_name();
-}
-
-
-THRIFT_REGISTER_GENERATOR(
-    csharp,
-    "C#",
-    "    async:           Adds Async support using Task.Run.\n"
-    "    wcf:             Adds bindings for WCF to generated classes.\n"
-    "    serial:          Add serialization support to generated classes.\n"
-    "    nullable:        Use nullable types for properties.\n"
-    "    hashcode:        Generate a hashcode and equals implementation for classes.\n"
-    "    union:           Use new union typing, which includes a static read function for union "
-    "types.\n")
diff --git a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc
index b2883ed..6737862 100644
--- a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc
@@ -157,12 +157,7 @@ void t_netstd_generator::init_generator()
 {
     MKDIR(get_out_dir().c_str());
 
-    // for usage of csharp namespaces in thrift files (from files for csharp)
     namespace_name_ = program_->get_namespace("netstd");
-    if (namespace_name_.empty())
-    {
-        namespace_name_ = program_->get_namespace("netstd");
-    }
 
     string dir = namespace_name_;
     string subdir = get_out_dir().c_str();
diff --git a/compiler/cpp/src/thrift/parse/t_program.h b/compiler/cpp/src/thrift/parse/t_program.h
index de68a0c..5b1b8d0 100644
--- a/compiler/cpp/src/thrift/parse/t_program.h
+++ b/compiler/cpp/src/thrift/parse/t_program.h
@@ -292,7 +292,7 @@ public:
         base_language = "st";
       }
       else if (base_language == "csharp") {
-        pwarning(1, "The '%s' target is deprecated. Consider moving to 'netstd' instead.", base_language.c_str());
+        pwarning(1, "The '%s' target is no longer available. Use 'netstd' instead.", base_language.c_str());
         // warn only, don't change base_language
       }
       else if (base_language == "netcore") {
diff --git a/compiler/cpp/src/thrift/thriftl.ll b/compiler/cpp/src/thrift/thriftl.ll
index 282e030..5f0ebd9 100644
--- a/compiler/cpp/src/thrift/thriftl.ll
+++ b/compiler/cpp/src/thrift/thriftl.ll
@@ -207,7 +207,6 @@ literal_begin (['\"])
 "cpp_include"        { return tok_cpp_include;          }
 "cpp_type"           { return tok_cpp_type;             }
 "java_package"       { error_unsupported_namespace_decl("java_package", "java"); /* do nothing */ }
-"csharp_namespace"   { error_unsupported_namespace_decl("csharp"); /* do nothing */ }
 "delphi_namespace"   { error_unsupported_namespace_decl("delphi"); /* do nothing */ }
 "php_namespace"      { error_unsupported_namespace_decl("php"); /* do nothing */ }
 "py_module"          { error_unsupported_namespace_decl("py_module", "py"); /* do nothing */ }
diff --git a/compiler/cpp/tests/CMakeLists.txt b/compiler/cpp/tests/CMakeLists.txt
index 7798c15..924e167 100644
--- a/compiler/cpp/tests/CMakeLists.txt
+++ b/compiler/cpp/tests/CMakeLists.txt
@@ -101,7 +101,6 @@ THRIFT_ADD_COMPILER(as3     "Enable compiler for ActionScript 3" OFF)
 THRIFT_ADD_COMPILER(c_glib  "Enable compiler for C with Glib" OFF)
 THRIFT_ADD_COMPILER(cl      "Enable compiler for Common LISP" OFF)
 THRIFT_ADD_COMPILER(cpp     "Enable compiler for C++" OFF)
-THRIFT_ADD_COMPILER(csharp  "Enable compiler for C#" OFF)
 THRIFT_ADD_COMPILER(d       "Enable compiler for D" OFF)
 THRIFT_ADD_COMPILER(dart    "Enable compiler for Dart" OFF)
 THRIFT_ADD_COMPILER(delphi  "Enable compiler for Delphi" OFF)
diff --git a/configure.ac b/configure.ac
index f3f88a7..99c3c9c 100755
--- a/configure.ac
+++ b/configure.ac
@@ -121,7 +121,6 @@ if test "$enable_libs" = "no"; then
   with_c_glib="no"
   with_cl="no"
   with_java="no"
-  with_csharp="no"
   with_python="no"
   with_py3="no"
   with_ruby="no"
@@ -212,24 +211,6 @@ if test "$have_cpp" = "yes" -o "$have_c_glib" = "yes";  then
   AX_CHECK_OPENSSL()
 fi
 
-AX_THRIFT_LIB(csharp, [C#], yes)
-if test "$with_csharp" = "yes";  then
-  PKG_CHECK_MODULES(MONO, mono >= 2.11.0, mono_2_11=yes, mono_2_11=no)
-  if test "$mono_2_11" == "yes"; then
-    AC_PATH_PROG([MCS], [mcs])
-    if test "x$MCS" != "x"; then
-      mono_mcs="yes"
-    fi
-  fi
-  PKG_CHECK_MODULES(MONO, mono >= 2.0.0, net_3_5=yes, net_3_5=no)
-  PKG_CHECK_MODULES(MONO, mono >= 1.2.4, have_mono=yes, have_mono=no)
-  if test "$have_mono" = "yes" ; then
-    have_csharp="yes"
-  fi
-fi
-AM_CONDITIONAL(WITH_MONO, [test "$have_csharp" = "yes"])
-AM_CONDITIONAL(NET_2_0, [test "$net_3_5" = "no"])
-AM_CONDITIONAL(MONO_MCS, [test "$mono_mcs" = "yes"])
 
 AX_THRIFT_LIB(java, [Java], yes)
 if test "$with_java" = "yes";  then
@@ -802,8 +783,6 @@ AC_CONFIG_FILES([
   lib/c_glib/Makefile
   lib/c_glib/thrift_c_glib.pc
   lib/c_glib/test/Makefile
-  lib/csharp/Makefile
-  lib/csharp/test/Multiplex/Makefile
   lib/d/Makefile
   lib/d/test/Makefile
   lib/erl/Makefile
@@ -838,7 +817,6 @@ AC_CONFIG_FILES([
   test/c_glib/Makefile
   test/cl/Makefile
   test/cpp/Makefile
-  test/csharp/Makefile
   test/erl/Makefile
   test/go/Makefile
   test/haxe/Makefile
@@ -885,8 +863,6 @@ if test "$have_d" = "yes" -a "$have_deimos_event2" = "yes" -a "$have_deimos_open
 AC_SUBST([MAYBE_D])
 if test "$have_java" = "yes" ; then MAYBE_JAVA="java" ; else MAYBE_JAVA="" ; fi
 AC_SUBST([MAYBE_JAVA])
-if test "$have_csharp" = "yes" ; then MAYBE_CSHARP="csharp" ; else MAYBE_CSHARP="" ; fi
-AC_SUBST([MAYBE_CSHARP])
 if test "$have_python" = "yes" ; then MAYBE_PYTHON="py" ; else MAYBE_PYTHON="" ; fi
 AC_SUBST([MAYBE_PYTHON])
 if test "$have_py3" = "yes" ; then MAYBE_PY3="py3" ; else MAYBE_PY3="" ; fi
@@ -928,7 +904,6 @@ echo "$PACKAGE $VERSION"
 echo
 echo "Building ActionScript3 Library : $have_as3"
 echo "Building C (GLib) Library .... : $have_c_glib"
-echo "Building C# (Mono) Library ... : $have_csharp"
 echo "Building C++ Library ......... : $have_cpp"
 echo "Building Common Lisp Library.. : $have_cl"
 echo "Building D Library ........... : $have_d"
@@ -960,12 +935,6 @@ if test "$have_c_glib" = "yes" ; then
   echo "C (glib):"
   echo "   Using glib version ........ : $($GSETTINGS --version)"
 fi
-if test "$have_csharp" = "yes" ; then
-  echo
-  echo "C# Library:"
-  echo "   Using .NET 3.5 ............ : $net_3_5"
-  echo "   Using mono version ........ : $($MCS --version | head -1)"
-fi
 if test "$have_cpp" = "yes" ; then
   echo
   echo "C++ Library:"
diff --git a/contrib/Rebus/README.md b/contrib/Rebus/README.md
index bbb9c49..7b11bd0 100644
--- a/contrib/Rebus/README.md
+++ b/contrib/Rebus/README.md
@@ -19,3 +19,8 @@ refer to the Rebus docs on how to do that (it's not that hard, really).
 
 Additional requirements:
 - RabbitMQ .NET client (see nuget)
+
+Deprecation notice:
+Csharp is not a supported Apache Thrift target anymore. Instead netstd is the 
+recommended replacement. This code is left "as is" for educational purposes 
+unless someone converts it to netstd
diff --git a/contrib/Vagrantfile b/contrib/Vagrantfile
index b340563..6d2d420 100644
--- a/contrib/Vagrantfile
+++ b/contrib/Vagrantfile
@@ -78,10 +78,6 @@ sudo apt-get install -qq lua5.2 lua5.2-dev
 # Node.js dependencies
 sudo apt-get install -qq nodejs nodejs-dev nodejs-legacy npm
 
-# CSharp
-sudo apt-get install -qq mono-gmcs mono-devel mono-xbuild mono-complete libmono-system-web2.0-cil
-sudo apt-get install -qq mingw32 mingw32-binutils mingw32-runtime nsis
-
 # D dependencies
 sudo wget http://master.dl.sourceforge.net/project/d-apt/files/d-apt.list -O /etc/apt/sources.list.d/d-apt.list
 sudo apt-get update && sudo apt-get -y --allow-unauthenticated install --reinstall d-apt-keyring && sudo apt-get update
diff --git a/contrib/thrift.spec b/contrib/thrift.spec
index 225a969..4c678ba 100644
--- a/contrib/thrift.spec
+++ b/contrib/thrift.spec
@@ -175,7 +175,6 @@ export RUBYLIB=${PWD}/lib/rb/lib
   %{?without_ruby:     --without-ruby     } \
   %{?without_php:      --without-php      } \
   %{!?without_php:     PHP_PREFIX=${RPM_BUILD_ROOT}/usr/lib/php } \
-  --without-csharp \
   --without-erlang \
 
 %if 0%{!?without_ruby:1}
diff --git a/contrib/zeromq/README.md b/contrib/zeromq/README.md
index 9e0b5bd..3a7379e 100644
--- a/contrib/zeromq/README.md
+++ b/contrib/zeromq/README.md
@@ -28,3 +28,8 @@ that amount.
 This code is not quite what I would consider production-ready.  It doesn't
 support all of the normal hooks into Thrift, and its performance is
 sub-optimal because it does some unnecessary copying.
+
+Deprecation notice:
+Csharp is not a supported Apache Thrift target anymore. Instead netstd is the 
+recommended replacement. This code is left "as is" for educational purposes 
+unless someone converts it to netstd
diff --git a/debian/control b/debian/control
index 414a815..a9e934f 100644
--- a/debian/control
+++ b/debian/control
@@ -1,8 +1,8 @@
 Source: thrift
 Section: devel
 Priority: extra
-Build-Depends: debhelper (>= 9), build-essential, mono-mcs, python-dev, ant,
-    mono-devel,  libmono-system-web4.0-cil, erlang-base, ruby-dev | ruby1.9.1-dev, ruby-bundler ,autoconf, automake,
+Build-Depends: dotnet-runtime-3.1, dotnet-sdk-3.1, debhelper (>= 9), build-essential, python-dev, ant,
+    erlang-base, ruby-dev | ruby1.9.1-dev, ruby-bundler ,autoconf, automake,
     pkg-config, libtool, bison, flex, libboost-dev | libboost1.56-dev | libboost1.63-all-dev,
     python-all, python-setuptools, python-all-dev, python-all-dbg,
     python3-all, python3-setuptools, python3-all-dev, python3-all-dbg,
@@ -126,17 +126,16 @@ Description: Java bindings for Thrift
  classes, and then the modules in this package will allow you to use those
  classes in your programs.
 
-Package: libthrift-cil
+Package: libthrift-netstd
 Architecture: all
-Section: cli-mono
-Depends: cli-common, libmono-corlib4.0-cil (>= 2.10) | libmono-corlib4.5-cil (>=3.2), libmono-system4.0-cil (>= 2.10),
-    libmono-system-web4.0-cil (>= 2.10), ${misc:Depends}
-Description: CLI bindings for Thrift
+Section: netstd
+Depends: dotnet-runtime-3.1, ${misc:Depends}
+Description: NET Standard bindings for Thrift
  Thrift is a software framework for scalable cross-language services
  development. It combines a software stack with a code generation engine to
  build services that work efficiently and seamlessly.
  .
- This package contains the CLI bindings for Thrift. You will need the thrift
+ This package contains the NET Standard bindings for Thrift. You will need the thrift
  tool (in the thrift-compiler package) to compile your definition to C#
  classes, and then the modules in this package will allow you to use those
  classes in your programs.
diff --git a/debian/copyright b/debian/copyright
index 3e6fcf7..ada769b 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -29,7 +29,7 @@ under the Apache 2.0 License:
 
   compiler/cpp/Makefile.am
   compiler/cpp/src/generate/t_cpp_generator.cc
-  compiler/cpp/src/generate/t_csharp_generator.cc
+  compiler/cpp/src/generate/t_netstd_generator.cc
   compiler/cpp/src/generate/t_erl_generator.cc
   compiler/cpp/src/generate/t_hs_generator.cc
   compiler/cpp/src/generate/t_java_generator.cc
@@ -46,36 +46,36 @@ under the Apache 2.0 License:
   compiler/cpp/src/platform.h
   compiler/cpp/src/thriftl.ll
   compiler/cpp/src/thrifty.yy
-  lib/csharp/src/Protocol/TBinaryProtocol.cs
-  lib/csharp/src/Protocol/TField.cs
-  lib/csharp/src/Protocol/TList.cs
-  lib/csharp/src/Protocol/TMap.cs
-  lib/csharp/src/Protocol/TMessage.cs
-  lib/csharp/src/Protocol/TMessageType.cs
-  lib/csharp/src/Protocol/TProtocol.cs
-  lib/csharp/src/Protocol/TProtocolException.cs
-  lib/csharp/src/Protocol/TProtocolFactory.cs
-  lib/csharp/src/Protocol/TProtocolUtil.cs
-  lib/csharp/src/Protocol/TSet.cs
-  lib/csharp/src/Protocol/TStruct.cs
-  lib/csharp/src/Protocol/TType.cs
-  lib/csharp/src/Server/TServer.cs
-  lib/csharp/src/Server/TSimpleServer.cs
-  lib/csharp/src/Server/TThreadPoolServer.cs
-  lib/csharp/src/TApplicationException.cs
-  lib/csharp/src/Thrift.csproj
-  lib/csharp/src/Thrift.sln
-  lib/csharp/src/TProcessor.cs
-  lib/csharp/src/Transport/TServerSocket.cs
-  lib/csharp/src/Transport/TServerTransport.cs
-  lib/csharp/src/Transport/TSocket.cs
-  lib/csharp/src/Transport/TStreamTransport.cs
-  lib/csharp/src/Transport/TTransport.cs
-  lib/csharp/src/Transport/TTransportException.cs
-  lib/csharp/src/Transport/TTransportFactory.cs
-  lib/csharp/ThriftMSBuildTask/Properties/AssemblyInfo.cs
-  lib/csharp/ThriftMSBuildTask/ThriftBuild.cs
-  lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj
+  lib/netstd/src/Protocol/TBinaryProtocol.cs
+  lib/netstd/src/Protocol/TField.cs
+  lib/netstd/src/Protocol/TList.cs
+  lib/netstd/src/Protocol/TMap.cs
+  lib/netstd/src/Protocol/TMessage.cs
+  lib/netstd/src/Protocol/TMessageType.cs
+  lib/netstd/src/Protocol/TProtocol.cs
+  lib/netstd/src/Protocol/TProtocolException.cs
+  lib/netstd/src/Protocol/TProtocolFactory.cs
+  lib/netstd/src/Protocol/TProtocolUtil.cs
+  lib/netstd/src/Protocol/TSet.cs
+  lib/netstd/src/Protocol/TStruct.cs
+  lib/netstd/src/Protocol/TType.cs
+  lib/netstd/src/Server/TServer.cs
+  lib/netstd/src/Server/TSimpleServer.cs
+  lib/netstd/src/Server/TThreadPoolServer.cs
+  lib/netstd/src/TApplicationException.cs
+  lib/netstd/src/Thrift.csproj
+  lib/netstd/src/Thrift.sln
+  lib/netstd/src/TProcessor.cs
+  lib/netstd/src/Transport/TServerSocket.cs
+  lib/netstd/src/Transport/TServerTransport.cs
+  lib/netstd/src/Transport/TSocket.cs
+  lib/netstd/src/Transport/TStreamTransport.cs
+  lib/netstd/src/Transport/TTransport.cs
+  lib/netstd/src/Transport/TTransportException.cs
+  lib/netstd/src/Transport/TTransportFactory.cs
+  lib/netstd/ThriftMSBuildTask/Properties/AssemblyInfo.cs
+  lib/netstd/ThriftMSBuildTask/ThriftBuild.cs
+  lib/netstd/ThriftMSBuildTask/ThriftMSBuildTask.csproj
   lib/rb/lib/thrift.rb
   lib/st/README
   lib/st/thrift.st
diff --git a/debian/rules b/debian/rules
index e209ba3..d0de508 100755
--- a/debian/rules
+++ b/debian/rules
@@ -76,7 +76,7 @@ build-indep-stamp: configure-stamp $(CURDIR)/compiler/cpp/thrift
 		./gradlew --no-daemon -Prelease=true jar
 
 	# C#
-	$(MAKE) -C $(CURDIR)/lib/csharp
+	$(MAKE) -C $(CURDIR)/lib/netstd
 
 	# Ruby
 	$(MAKE) -C $(CURDIR)/lib/rb
@@ -122,9 +122,9 @@ install-indep:
 		$(CURDIR)/debian/ruby-thrift/usr/lib/ruby/1.9.1
 
 	# C#
-	mkdir -p $(CURDIR)/debian/libthrift-cil/usr/lib/cli/thrift/ && \
-	cp $(CURDIR)/lib/csharp/Thrift.dll \
-		$(CURDIR)/debian/libthrift-cil/usr/lib/cli/thrift/Thrift.dll
+	mkdir -p $(CURDIR)/debian/libthrift-netstd/usr/lib/cli/thrift/ && \
+	cp $(CURDIR)/lib/netstd/Thrift/bin/Release/netstandard2.0/Thrift.dll \
+		$(CURDIR)/debian/libthrift-netstd/usr/lib/cli/thrift/Thrift.dll
 
 	# Perl
 	$(MAKE) -C $(CURDIR)/lib/perl install DESTDIR=$(CURDIR)/debian/libthrift-perl
diff --git a/doc/install/debian.md b/doc/install/debian.md
index 2ccc37d..d6b5500 100644
--- a/doc/install/debian.md
+++ b/doc/install/debian.md
@@ -32,8 +32,8 @@ If you would like to build Apache Thrift libraries for other programming languag
 	* libglib2.0-dev
  * Erlang
 	* erlang-base erlang-eunit erlang-dev rebar
- * Csharp
-	* mono-gmcs mono-devel libmono-system-web2.0-cil nunit nunit-console
+ * NetStd
+	* apt-transport-https dotnet-sdk-3.1 aspnetcore-runtime-3.1
  * Haskell
 	* ghc cabal-install libghc-binary-dev libghc-network-dev libghc-http-dev
  * Thrift Compiler for Windows
diff --git a/doc/specs/idl.md b/doc/specs/idl.md
index df7e8d7..7563310 100644
--- a/doc/specs/idl.md
+++ b/doc/specs/idl.md
@@ -38,7 +38,7 @@ A namespace declares which namespaces/package/module/etc. the type definitions i
 
     [5]  Namespace       ::=  ( 'namespace' ( NamespaceScope Identifier ) )
 
-    [6]  NamespaceScope  ::=  '*' | 'c_glib' | 'cpp' | 'csharp' | 'delphi' | 'go' | 'java' | 'js' | 'lua' | 'netcore' | 'perl' | 'php' | 'py' | 'py.twisted' | 'rb' | 'st' | 'xsd'
+    [6]  NamespaceScope  ::=  '*' | 'c_glib' | 'cpp' | 'delphi' | 'haxe' | 'go' | 'java' | 'js' | 'lua' | 'netstd' | 'perl' | 'php' | 'py' | 'py.twisted' | 'rb' | 'st' | 'xsd'
 
 ## Definition
 
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 51a2af0..5d16256 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -32,10 +32,6 @@ if WITH_C_GLIB
 SUBDIRS += c_glib
 endif
 
-if WITH_MONO
-SUBDIRS += csharp
-endif
-
 if WITH_JAVA
 SUBDIRS += java
 PRECROSS_TARGET += precross-java
diff --git a/lib/cpp/test/OneWayTest.thrift b/lib/cpp/test/OneWayTest.thrift
index 1e9894c..37d1eb3 100644
--- a/lib/cpp/test/OneWayTest.thrift
+++ b/lib/cpp/test/OneWayTest.thrift
@@ -26,7 +26,6 @@ namespace java onewaytest
 namespace cpp onewaytest
 namespace rb Onewaytest
 namespace perl OneWayTest
-namespace csharp Onewaytest
 namespace js OneWayTest
 namespace st OneWayTest
 namespace py OneWayTest
diff --git a/lib/csharp/Makefile.am b/lib/csharp/Makefile.am
deleted file mode 100644
index cc2bbc9..0000000
--- a/lib/csharp/Makefile.am
+++ /dev/null
@@ -1,114 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-SUBDIRS = . test/Multiplex
-
-THRIFTCODE = \
-            src/Collections/THashSet.cs \
-            src/Collections/TCollections.cs \
-            src/Properties/AssemblyInfo.cs \
-            src/Protocol/TAbstractBase.cs \
-            src/Protocol/TBase.cs \
-            src/Protocol/TBase64Utils.cs \
-            src/Protocol/TJSONProtocol.cs \
-            src/Protocol/TProtocolException.cs \
-            src/Protocol/TProtocolFactory.cs \
-            src/Protocol/TList.cs \
-            src/Protocol/TSet.cs \
-            src/Protocol/TMap.cs \
-            src/Protocol/TProtocolUtil.cs \
-            src/Protocol/TMessageType.cs \
-            src/Protocol/TProtocol.cs \
-            src/Protocol/TProtocolDecorator.cs \
-            src/Protocol/TMultiplexedProtocol.cs \
-            src/Protocol/TMultiplexedProcessor.cs \
-            src/Protocol/TType.cs \
-            src/Protocol/TField.cs \
-            src/Protocol/TMessage.cs \
-            src/Protocol/TStruct.cs \
-            src/Protocol/TBinaryProtocol.cs \
-            src/Protocol/TCompactProtocol.cs \
-            src/Server/TThreadedServer.cs \
-            src/Server/TThreadPoolServer.cs \
-            src/Server/TSimpleServer.cs \
-            src/Server/TServer.cs \
-            src/Server/TServerEventHandler.cs \
-            src/Transport/TBufferedTransport.cs \
-            src/Transport/TTransport.cs \
-            src/Transport/TSocket.cs \
-            src/Transport/TSocketVersionizer.cs \
-            src/Transport/TTransportException.cs \
-            src/Transport/TStreamTransport.cs \
-            src/Transport/TFramedTransport.cs \
-            src/Transport/TServerTransport.cs \
-            src/Transport/TServerSocket.cs \
-            src/Transport/TTransportFactory.cs \
-            src/Transport/THttpClient.cs \
-            src/Transport/THttpHandler.cs \
-            src/Transport/TMemoryBuffer.cs \
-            src/Transport/TNamedPipeClientTransport.cs \
-            src/Transport/TNamedPipeServerTransport.cs \
-            src/Transport/TTLSSocket.cs \
-            src/Transport/TTLSServerSocket.cs \
-            src/TProcessor.cs \
-            src/TProcessorFactory.cs \
-            src/TSingletonProcessorFactory.cs \
-            src/TPrototypeProcessorFactory.cs \
-            src/TControllingHandler.cs \
-            src/TException.cs \
-            src/TApplicationException.cs
-
-if MONO_MCS
-export CSC = mcs
-else
-export CSC = gmcs
-endif
-
-if NET_2_0
-export CSC_DEFINES = -d:NET_2_0
-endif
-
-all-local: Thrift.dll Thrift.45.dll
-
-Thrift.dll: $(THRIFTCODE)
-	$(CSC) $(CSC_DEFINES) -out:$@ -target:library -reference:System.Web $(THRIFTCODE)
-
-Thrift.45.dll: $(THRIFTCODE)
-	$(CSC) $(CSC_DEFINES) -out:$@ -target:library -reference:System.Web $(THRIFTCODE)
-
-CLEANFILES = \
-	Thrift.dll \
-	Thrift.45.dll
-
-DISTCLEANFILES = \
-	Makefile.in
-
-EXTRA_DIST = \
-	$(THRIFTCODE) \
-	ThriftMSBuildTask \
-	src/Thrift.csproj \
-	src/Thrift.45.csproj \
-	src/Thrift.sln \
-	src/Net35/ExtensionsNet35.cs \
-	src/Transport/TSilverlightSocket.cs \
-	src/Transport/THttpTaskAsyncHandler.cs \
-	src/TAsyncProcessor.cs \
-	test \
-	coding_standards.md \
-	README.md
diff --git a/lib/csharp/README.md b/lib/csharp/README.md
deleted file mode 100644
index 5fc14cb..0000000
--- a/lib/csharp/README.md
+++ /dev/null
@@ -1,32 +0,0 @@
-Thrift C# Software Library
-
-Deprecation notice
-=======
-
-Per [THRIFT-4723](https://issues.apache.org/jira/browse/THRIFT-4723), both CSharp and Netcore targets are deprecated 
-and will be removed with the next release. Migrate to the [NetStd language target](../netstd/README.md) instead.
-
-License
-=======
-
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
-
-Using Thrift with C#
-====================
-
-Thrift requires Mono >= 1.2.6 or .NET framework >= 3.5
diff --git a/lib/csharp/ThriftMSBuildTask/Properties/AssemblyInfo.cs b/lib/csharp/ThriftMSBuildTask/Properties/AssemblyInfo.cs
deleted file mode 100644
index f5f0000..0000000
--- a/lib/csharp/ThriftMSBuildTask/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("ThriftMSBuildTask")]
-[assembly: AssemblyDescription("MSBuild Task to generate csharp from .thrift files, and compile the code into a library: ThriftImpl.dll")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("The Apache Software Foundation")]
-[assembly: AssemblyProduct("ThriftMSBuildTask")]
-[assembly: AssemblyCopyright("The Apache Software Foundation")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-//@TODO where to put License information?
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components.  If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("5095e09d-7b95-4be1-b250-e1c1db1c485e")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("0.14.0.*")]
-[assembly: AssemblyFileVersion("0.14.0.*")]
diff --git a/lib/csharp/ThriftMSBuildTask/ThriftBuild.cs b/lib/csharp/ThriftMSBuildTask/ThriftBuild.cs
deleted file mode 100644
index 4e6d301..0000000
--- a/lib/csharp/ThriftMSBuildTask/ThriftBuild.cs
+++ /dev/null
@@ -1,246 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Microsoft.Build.Framework;
-using Microsoft.Build.Utilities;
-using Microsoft.Build.Tasks;
-using System.IO;
-using System.Diagnostics;
-
-namespace ThriftMSBuildTask
-{
-    /// <summary>
-    /// MSBuild Task to generate csharp from .thrift files, and compile the code into a library: ThriftImpl.dll
-    /// </summary>
-    public class ThriftBuild : Task
-    {
-        /// <summary>
-        /// The full path to the thrift.exe compiler
-        /// </summary>
-        [Required]
-        public ITaskItem ThriftExecutable
-        {
-            get;
-            set;
-        }
-
-        /// <summary>
-        /// The full path to a thrift.dll C# library
-        /// </summary>
-        [Required]
-        public ITaskItem ThriftLibrary
-        {
-            get;
-            set;
-        }
-
-        /// <summary>
-        /// A direcotry containing .thrift files
-        /// </summary>
-        [Required]
-        public ITaskItem ThriftDefinitionDir
-        {
-            get;
-            set;
-        }
-
-        /// <summary>
-        /// The name of the auto-gen and compiled thrift library. It will placed in
-        /// the same directory as ThriftLibrary
-        /// </summary>
-        [Required]
-        public ITaskItem OutputName
-        {
-            get;
-            set;
-        }
-
-        /// <summary>
-        /// The full path to the compiled ThriftLibrary. This allows msbuild tasks to use this
-        /// output as a variable for use elsewhere.
-        /// </summary>
-        [Output]
-        public ITaskItem ThriftImplementation
-        {
-            get { return thriftImpl; }
-        }
-
-        private ITaskItem thriftImpl;
-        private const string lastCompilationName = "LAST_COMP_TIMESTAMP";
-
-        //use the Message Build Task to write something to build log
-        private void LogMessage(string text, MessageImportance importance)
-        {
-            Message m = new Message();
-            m.Text = text;
-            m.Importance = importance.ToString();
-            m.BuildEngine = this.BuildEngine;
-            m.Execute();
-        }
-
-        //recursively find .cs files in srcDir, paths should initially be non-null and empty
-        private void FindSourcesHelper(string srcDir, List<string> paths)
-        {
-            string[] files = Directory.GetFiles(srcDir, "*.cs");
-            foreach (string f in files)
-            {
-                paths.Add(f);
-            }
-            string[] dirs = Directory.GetDirectories(srcDir);
-            foreach (string dir in dirs)
-            {
-                FindSourcesHelper(dir, paths);
-            }
-        }
-
-        /// <summary>
-        /// Quote paths with spaces
-        /// </summary>
-        private string SafePath(string path)
-        {
-            if (path.Contains(' ') && !path.StartsWith("\""))
-            {
-                return "\"" + path + "\"";
-            }
-            return path;
-        }
-
-        private ITaskItem[] FindSources(string srcDir)
-        {
-            List<string> files = new List<string>();
-            FindSourcesHelper(srcDir, files);
-            ITaskItem[] items = new ITaskItem[files.Count];
-            for (int i = 0; i < items.Length; i++)
-            {
-                items[i] = new TaskItem(files[i]);
-            }
-            return items;
-        }
-
-        private string LastWriteTime(string defDir)
-        {
-            string[] files = Directory.GetFiles(defDir, "*.thrift");
-            DateTime d = (new DirectoryInfo(defDir)).LastWriteTime;
-            foreach(string file in files)
-            {
-                FileInfo f = new FileInfo(file);
-                DateTime curr = f.LastWriteTime;
-                if (DateTime.Compare(curr, d) > 0)
-                {
-                    d = curr;
-                }
-            }
-            return d.ToFileTimeUtc().ToString();
-        }
-
-        public override bool Execute()
-        {
-            string defDir = SafePath(ThriftDefinitionDir.ItemSpec);
-            //look for last compilation timestamp
-            string lastBuildPath = Path.Combine(defDir, lastCompilationName);
-            DirectoryInfo defDirInfo = new DirectoryInfo(defDir);
-            string lastWrite = LastWriteTime(defDir);
-            if (File.Exists(lastBuildPath))
-            {
-                string lastComp = File.ReadAllText(lastBuildPath);
-                //don't recompile if the thrift library has been updated since lastComp
-                FileInfo f = new FileInfo(ThriftLibrary.ItemSpec);
-                string thriftLibTime = f.LastWriteTimeUtc.ToFileTimeUtc().ToString();
-                if (lastComp.CompareTo(thriftLibTime) < 0)
-                {
-                    //new thrift library, do a compile
-                    lastWrite = thriftLibTime;
-                }
-                else if (lastComp == lastWrite || (lastComp == thriftLibTime && lastComp.CompareTo(lastWrite) > 0))
-                {
-                    //the .thrift dir hasn't been written to since last compilation, don't need to do anything
-                    LogMessage("ThriftImpl up-to-date", MessageImportance.High);
-                    return true;
-                }
-            }
-
-            //find the directory of the thriftlibrary (that's where output will go)
-            FileInfo thriftLibInfo = new FileInfo(SafePath(ThriftLibrary.ItemSpec));
-            string thriftDir = thriftLibInfo.Directory.FullName;
-
-            string genDir = Path.Combine(thriftDir, "gen-csharp");
-            if (Directory.Exists(genDir))
-            {
-                try
-                {
-                    Directory.Delete(genDir, true);
-                }
-                catch { /*eh i tried, just over-write now*/}
-            }
-
-            //run the thrift executable to generate C#
-            foreach (string thriftFile in Directory.GetFiles(defDir, "*.thrift"))
-            {
-                LogMessage("Generating code for: " + thriftFile, MessageImportance.Normal);
-                Process p = new Process();
-                p.StartInfo.FileName = SafePath(ThriftExecutable.ItemSpec);
-                p.StartInfo.Arguments = "--gen csharp -o " + SafePath(thriftDir) + " -r " + thriftFile;
-                p.StartInfo.UseShellExecute = false;
-                p.StartInfo.CreateNoWindow = true;
-                p.StartInfo.RedirectStandardOutput = false;
-                p.Start();
-                p.WaitForExit();
-                if (p.ExitCode != 0)
-                {
-                    LogMessage("thrift.exe failed to compile " + thriftFile, MessageImportance.High);
-                    return false;
-                }
-                if (p.ExitCode != 0)
-                {
-                    LogMessage("thrift.exe failed to compile " + thriftFile, MessageImportance.High);
-                    return false;
-                }
-            }
-
-            Csc csc = new Csc();
-            csc.TargetType = "library";
-            csc.References = new ITaskItem[] { new TaskItem(ThriftLibrary.ItemSpec) };
-            csc.EmitDebugInformation = true;
-            string outputPath = Path.Combine(thriftDir, OutputName.ItemSpec);
-            csc.OutputAssembly = new TaskItem(outputPath);
-            csc.Sources = FindSources(Path.Combine(thriftDir, "gen-csharp"));
-            csc.BuildEngine = this.BuildEngine;
-            LogMessage("Compiling generated cs...", MessageImportance.Normal);
-            if (!csc.Execute())
-            {
-                return false;
-            }
-
-            //write file to defDir to indicate a build was successfully completed
-            File.WriteAllText(lastBuildPath, lastWrite);
-
-            thriftImpl = new TaskItem(outputPath);
-
-            return true;
-        }
-    }
-}
diff --git a/lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj b/lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj
deleted file mode 100644
index 2589970..0000000
--- a/lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj
+++ /dev/null
@@ -1,118 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements. See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership. The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License. You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied. See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProductVersion>9.0.21022</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{EC0A0231-66EA-4593-A792-C6CA3BB8668E}</ProjectGuid>
-    <OutputType>Library</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>ThriftMSBuildTask</RootNamespace>
-    <AssemblyName>ThriftMSBuildTask</AssemblyName>
-    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
-    <FileAlignment>512</FileAlignment>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <OldToolsVersion>3.5</OldToolsVersion>
-    <UpgradeBackupLocation />
-    <PublishUrl>publish\</PublishUrl>
-    <Install>true</Install>
-    <InstallFrom>Disk</InstallFrom>
-    <UpdateEnabled>false</UpdateEnabled>
-    <UpdateMode>Foreground</UpdateMode>
-    <UpdateInterval>7</UpdateInterval>
-    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
-    <UpdatePeriodically>false</UpdatePeriodically>
-    <UpdateRequired>false</UpdateRequired>
-    <MapFileExtensions>true</MapFileExtensions>
-    <ApplicationRevision>0</ApplicationRevision>
-    <ApplicationVersion>0.14.0.0</ApplicationVersion>
-    <IsWebBootstrapper>false</IsWebBootstrapper>
-    <UseApplicationTrust>false</UseApplicationTrust>
-    <BootstrapperEnabled>true</BootstrapperEnabled>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>bin\Debug\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\Release\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="Microsoft.Build.Framework" />
-    <Reference Include="Microsoft.Build.Tasks" />
-    <Reference Include="Microsoft.Build.Utilities" />
-    <Reference Include="System" />
-    <Reference Include="System.Core">
-      <RequiredTargetFramework>3.5</RequiredTargetFramework>
-    </Reference>
-    <Reference Include="System.Xml.Linq">
-      <RequiredTargetFramework>3.5</RequiredTargetFramework>
-    </Reference>
-    <Reference Include="System.Data.DataSetExtensions">
-      <RequiredTargetFramework>3.5</RequiredTargetFramework>
-    </Reference>
-    <Reference Include="System.Data" />
-    <Reference Include="System.Xml" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="ThriftBuild.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.5 SP1</ProductName>
-      <Install>true</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
-      <Visible>False</Visible>
-      <ProductName>Windows Installer 3.1</ProductName>
-      <Install>true</Install>
-    </BootstrapperPackage>
-  </ItemGroup>
-  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
-  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
-       Other similar extension points exist, see Microsoft.Common.targets.
-  <Target Name="BeforeBuild">
-  </Target>
-  <Target Name="AfterBuild">
-  </Target>
-  -->
-</Project>
diff --git a/lib/csharp/coding_standards.md b/lib/csharp/coding_standards.md
deleted file mode 100644
index dc87190..0000000
--- a/lib/csharp/coding_standards.md
+++ /dev/null
@@ -1,6 +0,0 @@
-## C# Coding Standards
-
-Please follow:
- * [Thrift General Coding Standards](/doc/coding_standards.md)
- * [MSDN C# Coding Conventions](http://msdn.microsoft.com/en-us/library/ff926074.aspx)
- * [C# Coding Guidelines](http://csharpguidelines.codeplex.com/)
diff --git a/lib/csharp/src/Collections/TCollections.cs b/lib/csharp/src/Collections/TCollections.cs
deleted file mode 100644
index 84afb6a..0000000
--- a/lib/csharp/src/Collections/TCollections.cs
+++ /dev/null
@@ -1,94 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-using System;
-using System.Collections;
-
-namespace Thrift.Collections
-{
-    public class TCollections
-    {
-        /// <summary>
-        /// This will return true if the two collections are value-wise the same.
-        /// If the collection contains a collection, the collections will be compared using this method.
-        /// </summary>
-        public static bool Equals (IEnumerable first, IEnumerable second)
-        {
-            if (first == null && second == null)
-            {
-                return true;
-            }
-            if (first == null || second == null)
-            {
-                return false;
-            }
-            IEnumerator fiter = first.GetEnumerator ();
-            IEnumerator siter = second.GetEnumerator ();
-
-            bool fnext = fiter.MoveNext ();
-            bool snext = siter.MoveNext ();
-            while (fnext && snext)
-            {
-                IEnumerable fenum = fiter.Current as IEnumerable;
-                IEnumerable senum = siter.Current as IEnumerable;
-                if (fenum != null && senum != null)
-                {
-                    if (!Equals(fenum, senum))
-                    {
-                        return false;
-                    }
-                }
-                else if (fenum == null ^ senum == null)
-                {
-                    return false;
-                }
-                else if (!Equals(fiter.Current, siter.Current))
-                {
-                    return false;
-                }
-                fnext = fiter.MoveNext();
-                snext = siter.MoveNext();
-            }
-
-            return fnext == snext;
-        }
-
-        /// <summary>
-        /// This returns a hashcode based on the value of the enumerable.
-        /// </summary>
-        public static int GetHashCode (IEnumerable enumerable)
-        {
-            if (enumerable == null)
-            {
-                return 0;
-            }
-
-            int hashcode = 0;
-            foreach (object obj in enumerable)
-            {
-                IEnumerable enum2 = obj as IEnumerable;
-                int objHash = enum2 == null ? obj.GetHashCode () : GetHashCode (enum2);
-                unchecked
-                {
-                    hashcode = (hashcode * 397) ^ (objHash);
-                }
-            }
-            return hashcode;
-        }
-    }
-}
diff --git a/lib/csharp/src/Collections/THashSet.cs b/lib/csharp/src/Collections/THashSet.cs
deleted file mode 100644
index e29271a..0000000
--- a/lib/csharp/src/Collections/THashSet.cs
+++ /dev/null
@@ -1,160 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System;
-using System.Collections;
-using System.Collections.Generic;
-
-#if SILVERLIGHT
-using System.Runtime.Serialization;
-#endif
-
-namespace Thrift.Collections
-{
-#if SILVERLIGHT
-    [DataContract]
-#else
-    [Serializable]
-#endif
-    public class THashSet<T> : ICollection<T>
-    {
-#if NET_2_0 || SILVERLIGHT
-#if SILVERLIGHT
-        [DataMember]
-#endif
-        TDictSet<T> set = new TDictSet<T>();
-#else
-        HashSet<T> set = new HashSet<T>();
-#endif
-        public int Count
-        {
-            get { return set.Count; }
-        }
-
-        public bool IsReadOnly
-        {
-            get { return false; }
-        }
-
-        public void Add(T item)
-        {
-            set.Add(item);
-        }
-
-        public void Clear()
-        {
-            set.Clear();
-        }
-
-        public bool Contains(T item)
-        {
-            return set.Contains(item);
-        }
-
-        public void CopyTo(T[] array, int arrayIndex)
-        {
-            set.CopyTo(array, arrayIndex);
-        }
-
-        public IEnumerator GetEnumerator()
-        {
-            return set.GetEnumerator();
-        }
-
-        IEnumerator<T> IEnumerable<T>.GetEnumerator()
-        {
-            return ((IEnumerable<T>)set).GetEnumerator();
-        }
-
-        public bool Remove(T item)
-        {
-            return set.Remove(item);
-        }
-
-#if NET_2_0 || SILVERLIGHT
-#if SILVERLIGHT
-        [DataContract]
-#endif
-        private class TDictSet<V> : ICollection<V>
-        {
-#if SILVERLIGHT
-            [DataMember]
-#endif
-            Dictionary<V, TDictSet<V>> dict = new Dictionary<V, TDictSet<V>>();
-
-            public int Count
-            {
-                get { return dict.Count; }
-            }
-
-            public bool IsReadOnly
-            {
-                get { return false; }
-            }
-
-            public IEnumerator GetEnumerator()
-            {
-                return ((IEnumerable)dict.Keys).GetEnumerator();
-            }
-
-            IEnumerator<V> IEnumerable<V>.GetEnumerator()
-            {
-                return dict.Keys.GetEnumerator();
-            }
-
-            public bool Add(V item)
-            {
-                if (!dict.ContainsKey(item))
-                {
-                    dict[item] = this;
-                    return true;
-                }
-
-                return false;
-            }
-
-            void ICollection<V>.Add(V item)
-            {
-                Add(item);
-            }
-
-            public void Clear()
-            {
-                dict.Clear();
-            }
-
-            public bool Contains(V item)
-            {
-                return dict.ContainsKey(item);
-            }
-
-            public void CopyTo(V[] array, int arrayIndex)
-            {
-                dict.Keys.CopyTo(array, arrayIndex);
-            }
-
-            public bool Remove(V item)
-            {
-                return dict.Remove(item);
-            }
-        }
-#endif
-    }
-
-}
diff --git a/lib/csharp/src/Net35/ExtensionsNet35.cs b/lib/csharp/src/Net35/ExtensionsNet35.cs
deleted file mode 100644
index 73a4232..0000000
--- a/lib/csharp/src/Net35/ExtensionsNet35.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Text;
-
-#if (!NET45)
-namespace Thrift
-{
-    static class StreamExtensionsNet35
-    {
-        // CopyTo() has been added in 4.0
-        public static long CopyTo(this Stream source, Stream target)
-        {
-            byte[] buffer = new byte[8192];  // multiple of 4096
-            long nTotal = 0;
-            while (true)
-            {
-                int nRead = source.Read(buffer, 0, buffer.Length);
-                if (nRead <= 0)  // done?
-                    return nTotal;
-
-                target.Write(buffer, 0, nRead);
-                nTotal += nRead;
-            }
-        }
-    }
-
-}
-#endif
-
diff --git a/lib/csharp/src/Properties/AssemblyInfo.cs b/lib/csharp/src/Properties/AssemblyInfo.cs
deleted file mode 100644
index c8f51b5..0000000
--- a/lib/csharp/src/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("Thrift")]
-[assembly: AssemblyDescription("C# bindings for the Apache Thrift RPC system")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("The Apache Software Foundation")]
-[assembly: AssemblyProduct("Thrift")]
-[assembly: AssemblyCopyright("The Apache Software Foundation")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-//@TODO where to put License information?
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components.  If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("df3f8ef0-e0a3-4c86-a65b-8ec84e016b1d")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-[assembly: AssemblyVersion("0.14.0.0")]
-[assembly: AssemblyFileVersion("0.14.0.0")]
diff --git a/lib/csharp/src/Protocol/TAbstractBase.cs b/lib/csharp/src/Protocol/TAbstractBase.cs
deleted file mode 100644
index f5a61cd..0000000
--- a/lib/csharp/src/Protocol/TAbstractBase.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-namespace Thrift.Protocol
-{
-    public interface TAbstractBase
-    {
-        /// <summary>
-        /// Writes the objects out to the protocol.
-        /// </summary>
-        void Write(TProtocol tProtocol);
-    }
-}
diff --git a/lib/csharp/src/Protocol/TBase.cs b/lib/csharp/src/Protocol/TBase.cs
deleted file mode 100644
index 411e4d9..0000000
--- a/lib/csharp/src/Protocol/TBase.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-namespace Thrift.Protocol
-{
-    public interface TBase : TAbstractBase
-    {
-        /// <summary>
-        /// Reads the TObject from the given input protocol.
-        /// </summary>
-        void Read(TProtocol tProtocol);
-    }
-}
diff --git a/lib/csharp/src/Protocol/TBase64Utils.cs b/lib/csharp/src/Protocol/TBase64Utils.cs
deleted file mode 100644
index 9eaaebd..0000000
--- a/lib/csharp/src/Protocol/TBase64Utils.cs
+++ /dev/null
@@ -1,100 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System;
-
-namespace Thrift.Protocol
-{
-    internal static class TBase64Utils
-    {
-        internal const string ENCODE_TABLE =
-            "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-        internal static void encode(byte[] src, int srcOff, int len, byte[] dst,
-                                int dstOff)
-        {
-            dst[dstOff] = (byte)ENCODE_TABLE[(src[srcOff] >> 2) & 0x3F];
-            if (len == 3)
-            {
-                dst[dstOff + 1] =
-                    (byte)ENCODE_TABLE[
-                        ((src[srcOff] << 4) & 0x30) | ((src[srcOff + 1] >> 4) & 0x0F)];
-                dst[dstOff + 2] =
-                    (byte)ENCODE_TABLE[
-                        ((src[srcOff + 1] << 2) & 0x3C) | ((src[srcOff + 2] >> 6) & 0x03)];
-                dst[dstOff + 3] =
-                    (byte)ENCODE_TABLE[src[srcOff + 2] & 0x3F];
-            }
-            else if (len == 2)
-            {
-                dst[dstOff + 1] =
-                    (byte)ENCODE_TABLE[
-                        ((src[srcOff] << 4) & 0x30) | ((src[srcOff + 1] >> 4) & 0x0F)];
-                dst[dstOff + 2] =
-                    (byte)ENCODE_TABLE[(src[srcOff + 1] << 2) & 0x3C];
-
-            }
-            else
-            { // len == 1) {
-                dst[dstOff + 1] =
-                    (byte)ENCODE_TABLE[(src[srcOff] << 4) & 0x30];
-            }
-        }
-
-        private static int[] DECODE_TABLE = {
-            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,
-            52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,
-            -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,
-            15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,
-            -1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,
-            41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1,
-            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-        };
-
-        internal static void decode(byte[] src, int srcOff, int len, byte[] dst,
-                                 int dstOff)
-        {
-            dst[dstOff] = (byte)
-                ((DECODE_TABLE[src[srcOff] & 0x0FF] << 2) |
-                (DECODE_TABLE[src[srcOff + 1] & 0x0FF] >> 4));
-            if (len > 2)
-            {
-                dst[dstOff + 1] = (byte)
-                    (((DECODE_TABLE[src[srcOff + 1] & 0x0FF] << 4) & 0xF0) |
-                    (DECODE_TABLE[src[srcOff + 2] & 0x0FF] >> 2));
-                if (len > 3)
-                {
-                    dst[dstOff + 2] = (byte)
-                        (((DECODE_TABLE[src[srcOff + 2] & 0x0FF] << 6) & 0xC0) |
-                        DECODE_TABLE[src[srcOff + 3] & 0x0FF]);
-                }
-            }
-        }
-
-    }
-}
diff --git a/lib/csharp/src/Protocol/TBinaryProtocol.cs b/lib/csharp/src/Protocol/TBinaryProtocol.cs
deleted file mode 100644
index a4faa94..0000000
--- a/lib/csharp/src/Protocol/TBinaryProtocol.cs
+++ /dev/null
@@ -1,395 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Text;
-using Thrift.Transport;
-
-namespace Thrift.Protocol
-{
-    public class TBinaryProtocol : TProtocol
-    {
-        protected const uint VERSION_MASK = 0xffff0000;
-        protected const uint VERSION_1 = 0x80010000;
-
-        protected bool strictRead_ = false;
-        protected bool strictWrite_ = true;
-
-        #region BinaryProtocol Factory
-
-        public class Factory : TProtocolFactory
-        {
-            protected bool strictRead_ = false;
-            protected bool strictWrite_ = true;
-
-            public Factory()
-                : this(false, true)
-            {
-            }
-
-            public Factory(bool strictRead, bool strictWrite)
-            {
-                strictRead_ = strictRead;
-                strictWrite_ = strictWrite;
-            }
-
-            public TProtocol GetProtocol(TTransport trans)
-            {
-                return new TBinaryProtocol(trans, strictRead_, strictWrite_);
-            }
-        }
-
-        #endregion
-
-        public TBinaryProtocol(TTransport trans)
-            : this(trans, false, true)
-        {
-        }
-
-        public TBinaryProtocol(TTransport trans, bool strictRead, bool strictWrite)
-            : base(trans)
-        {
-            strictRead_ = strictRead;
-            strictWrite_ = strictWrite;
-        }
-
-        #region Write Methods
-
-        public override void WriteMessageBegin(TMessage message)
-        {
-            if (strictWrite_)
-            {
-                uint version = VERSION_1 | (uint)(message.Type);
-                WriteI32((int)version);
-                WriteString(message.Name);
-                WriteI32(message.SeqID);
-            }
-            else
-            {
-                WriteString(message.Name);
-                WriteByte((sbyte)message.Type);
-                WriteI32(message.SeqID);
-            }
-        }
-
-        public override void WriteMessageEnd()
-        {
-        }
-
-        public override void WriteStructBegin(TStruct struc)
-        {
-        }
-
-        public override void WriteStructEnd()
-        {
-        }
-
-        public override void WriteFieldBegin(TField field)
-        {
-            WriteByte((sbyte)field.Type);
-            WriteI16(field.ID);
-        }
-
-        public override void WriteFieldEnd()
-        {
-        }
-
-        public override void WriteFieldStop()
-        {
-            WriteByte((sbyte)TType.Stop);
-        }
-
-        public override void WriteMapBegin(TMap map)
-        {
-            WriteByte((sbyte)map.KeyType);
-            WriteByte((sbyte)map.ValueType);
-            WriteI32(map.Count);
-        }
-
-        public override void WriteMapEnd()
-        {
-        }
-
-        public override void WriteListBegin(TList list)
-        {
-            WriteByte((sbyte)list.ElementType);
-            WriteI32(list.Count);
-        }
-
-        public override void WriteListEnd()
-        {
-        }
-
-        public override void WriteSetBegin(TSet set)
-        {
-            WriteByte((sbyte)set.ElementType);
-            WriteI32(set.Count);
-        }
-
-        public override void WriteSetEnd()
-        {
-        }
-
-        public override void WriteBool(bool b)
-        {
-            WriteByte(b ? (sbyte)1 : (sbyte)0);
-        }
-
-        private byte[] bout = new byte[1];
-        public override void WriteByte(sbyte b)
-        {
-            bout[0] = (byte)b;
-            trans.Write(bout, 0, 1);
-        }
-
-        private byte[] i16out = new byte[2];
-        public override void WriteI16(short s)
-        {
-            i16out[0] = (byte)(0xff & (s >> 8));
-            i16out[1] = (byte)(0xff & s);
-            trans.Write(i16out, 0, 2);
-        }
-
-        private byte[] i32out = new byte[4];
-        public override void WriteI32(int i32)
-        {
-            i32out[0] = (byte)(0xff & (i32 >> 24));
-            i32out[1] = (byte)(0xff & (i32 >> 16));
-            i32out[2] = (byte)(0xff & (i32 >> 8));
-            i32out[3] = (byte)(0xff & i32);
-            trans.Write(i32out, 0, 4);
-        }
-
-        private byte[] i64out = new byte[8];
-        public override void WriteI64(long i64)
-        {
-            i64out[0] = (byte)(0xff & (i64 >> 56));
-            i64out[1] = (byte)(0xff & (i64 >> 48));
-            i64out[2] = (byte)(0xff & (i64 >> 40));
-            i64out[3] = (byte)(0xff & (i64 >> 32));
-            i64out[4] = (byte)(0xff & (i64 >> 24));
-            i64out[5] = (byte)(0xff & (i64 >> 16));
-            i64out[6] = (byte)(0xff & (i64 >> 8));
-            i64out[7] = (byte)(0xff & i64);
-            trans.Write(i64out, 0, 8);
-        }
-
-        public override void WriteDouble(double d)
-        {
-#if !SILVERLIGHT
-            WriteI64(BitConverter.DoubleToInt64Bits(d));
-#else
-            var bytes = BitConverter.GetBytes(d);
-            WriteI64(BitConverter.ToInt64(bytes, 0));
-#endif
-        }
-
-        public override void WriteBinary(byte[] b)
-        {
-            WriteI32(b.Length);
-            trans.Write(b, 0, b.Length);
-        }
-
-        #endregion
-
-        #region ReadMethods
-
-        public override TMessage ReadMessageBegin()
-        {
-            TMessage message = new TMessage();
-            int size = ReadI32();
-            if (size < 0)
-            {
-                uint version = (uint)size & VERSION_MASK;
-                if (version != VERSION_1)
-                {
-                    throw new TProtocolException(TProtocolException.BAD_VERSION, "Bad version in ReadMessageBegin: " + version);
-                }
-                message.Type = (TMessageType)(size & 0x000000ff);
-                message.Name = ReadString();
-                message.SeqID = ReadI32();
-            }
-            else
-            {
-                if (strictRead_)
-                {
-                    throw new TProtocolException(TProtocolException.BAD_VERSION, "Missing version in readMessageBegin, old client?");
-                }
-                message.Name = ReadStringBody(size);
-                message.Type = (TMessageType)ReadByte();
-                message.SeqID = ReadI32();
-            }
-            return message;
-        }
-
-        public override void ReadMessageEnd()
-        {
-        }
-
-        public override TStruct ReadStructBegin()
-        {
-            return new TStruct();
-        }
-
-        public override void ReadStructEnd()
-        {
-        }
-
-        public override TField ReadFieldBegin()
-        {
-            TField field = new TField();
-            field.Type = (TType)ReadByte();
-
-            if (field.Type != TType.Stop)
-            {
-                field.ID = ReadI16();
-            }
-
-            return field;
-        }
-
-        public override void ReadFieldEnd()
-        {
-        }
-
-        public override TMap ReadMapBegin()
-        {
-            TMap map = new TMap();
-            map.KeyType = (TType)ReadByte();
-            map.ValueType = (TType)ReadByte();
-            map.Count = ReadI32();
-
-            return map;
-        }
-
-        public override void ReadMapEnd()
-        {
-        }
-
-        public override TList ReadListBegin()
-        {
-            TList list = new TList();
-            list.ElementType = (TType)ReadByte();
-            list.Count = ReadI32();
-
-            return list;
-        }
-
-        public override void ReadListEnd()
-        {
-        }
-
-        public override TSet ReadSetBegin()
-        {
-            TSet set = new TSet();
-            set.ElementType = (TType)ReadByte();
-            set.Count = ReadI32();
-
-            return set;
-        }
-
-        public override void ReadSetEnd()
-        {
-        }
-
-        public override bool ReadBool()
-        {
-            return ReadByte() == 1;
-        }
-
-        private byte[] bin = new byte[1];
-        public override sbyte ReadByte()
-        {
-            ReadAll(bin, 0, 1);
-            return (sbyte)bin[0];
-        }
-
-        private byte[] i16in = new byte[2];
-        public override short ReadI16()
-        {
-            ReadAll(i16in, 0, 2);
-            return (short)(((i16in[0] & 0xff) << 8) | ((i16in[1] & 0xff)));
-        }
-
-        private byte[] i32in = new byte[4];
-        public override int ReadI32()
-        {
-            ReadAll(i32in, 0, 4);
-            return (int)(((i32in[0] & 0xff) << 24) | ((i32in[1] & 0xff) << 16) | ((i32in[2] & 0xff) << 8) | ((i32in[3] & 0xff)));
-        }
-
-#pragma warning disable 675
-
-        private byte[] i64in = new byte[8];
-        public override long ReadI64()
-        {
-            ReadAll(i64in, 0, 8);
-            unchecked
-            {
-                return (long)(
-                    ((long)(i64in[0] & 0xff) << 56) |
-                    ((long)(i64in[1] & 0xff) << 48) |
-                    ((long)(i64in[2] & 0xff) << 40) |
-                    ((long)(i64in[3] & 0xff) << 32) |
-                    ((long)(i64in[4] & 0xff) << 24) |
-                    ((long)(i64in[5] & 0xff) << 16) |
-                    ((long)(i64in[6] & 0xff) << 8) |
-                    ((long)(i64in[7] & 0xff)));
-            }
-        }
-
-#pragma warning restore 675
-
-        public override double ReadDouble()
-        {
-#if !SILVERLIGHT
-            return BitConverter.Int64BitsToDouble(ReadI64());
-#else
-            var value = ReadI64();
-            var bytes = BitConverter.GetBytes(value);
-            return BitConverter.ToDouble(bytes, 0);
-#endif
-        }
-
-        public override byte[] ReadBinary()
-        {
-            int size = ReadI32();
-            byte[] buf = new byte[size];
-            trans.ReadAll(buf, 0, size);
-            return buf;
-        }
-        private string ReadStringBody(int size)
-        {
-            byte[] buf = new byte[size];
-            trans.ReadAll(buf, 0, size);
-            return Encoding.UTF8.GetString(buf, 0, buf.Length);
-        }
-
-        private int ReadAll(byte[] buf, int off, int len)
-        {
-            return trans.ReadAll(buf, off, len);
-        }
-
-        #endregion
-    }
-}
diff --git a/lib/csharp/src/Protocol/TCompactProtocol.cs b/lib/csharp/src/Protocol/TCompactProtocol.cs
deleted file mode 100644
index ff67397..0000000
--- a/lib/csharp/src/Protocol/TCompactProtocol.cs
+++ /dev/null
@@ -1,849 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Text;
-using Thrift.Transport;
-using System.Collections;
-using System.IO;
-using System.Collections.Generic;
-
-namespace Thrift.Protocol
-{
-    public class TCompactProtocol : TProtocol
-    {
-        private static TStruct ANONYMOUS_STRUCT = new TStruct("");
-        private static TField TSTOP = new TField("", TType.Stop, (short)0);
-
-        private static byte[] ttypeToCompactType = new byte[16];
-
-        private const byte PROTOCOL_ID = 0x82;
-        private const byte VERSION = 1;
-        private const byte VERSION_MASK = 0x1f; // 0001 1111
-        private const byte TYPE_MASK = 0xE0; // 1110 0000
-        private const byte TYPE_BITS = 0x07; // 0000 0111
-        private const int TYPE_SHIFT_AMOUNT = 5;
-
-        /// <summary>
-        /// All of the on-wire type codes.
-        /// </summary>
-        private static class Types
-        {
-            public const byte STOP = 0x00;
-            public const byte BOOLEAN_TRUE = 0x01;
-            public const byte BOOLEAN_FALSE = 0x02;
-            public const byte BYTE = 0x03;
-            public const byte I16 = 0x04;
-            public const byte I32 = 0x05;
-            public const byte I64 = 0x06;
-            public const byte DOUBLE = 0x07;
-            public const byte BINARY = 0x08;
-            public const byte LIST = 0x09;
-            public const byte SET = 0x0A;
-            public const byte MAP = 0x0B;
-            public const byte STRUCT = 0x0C;
-        }
-
-        /// <summary>
-        /// Used to keep track of the last field for the current and previous structs,
-        /// so we can do the delta stuff.
-        /// </summary>
-        private Stack<short> lastField_ = new Stack<short>(15);
-
-        private short lastFieldId_ = 0;
-
-        /// <summary>
-        /// If we encounter a boolean field begin, save the TField here so it can
-        /// have the value incorporated.
-        /// </summary>
-        private Nullable<TField> booleanField_;
-
-        /// <summary>
-        /// If we Read a field header, and it's a boolean field, save the boolean
-        /// value here so that ReadBool can use it.
-        /// </summary>
-        private Nullable<Boolean> boolValue_;
-
-
-        #region CompactProtocol Factory
-
-        public class Factory : TProtocolFactory
-        {
-            public Factory() { }
-
-            public TProtocol GetProtocol(TTransport trans)
-            {
-                return new TCompactProtocol(trans);
-            }
-        }
-
-        #endregion
-
-        public TCompactProtocol(TTransport trans)
-            : base(trans)
-        {
-            ttypeToCompactType[(int)TType.Stop] = Types.STOP;
-            ttypeToCompactType[(int)TType.Bool] = Types.BOOLEAN_TRUE;
-            ttypeToCompactType[(int)TType.Byte] = Types.BYTE;
-            ttypeToCompactType[(int)TType.I16] = Types.I16;
-            ttypeToCompactType[(int)TType.I32] = Types.I32;
-            ttypeToCompactType[(int)TType.I64] = Types.I64;
-            ttypeToCompactType[(int)TType.Double] = Types.DOUBLE;
-            ttypeToCompactType[(int)TType.String] = Types.BINARY;
-            ttypeToCompactType[(int)TType.List] = Types.LIST;
-            ttypeToCompactType[(int)TType.Set] = Types.SET;
-            ttypeToCompactType[(int)TType.Map] = Types.MAP;
-            ttypeToCompactType[(int)TType.Struct] = Types.STRUCT;
-        }
-
-        public void reset()
-        {
-            lastField_.Clear();
-            lastFieldId_ = 0;
-        }
-
-        #region Write Methods
-
-        /// <summary>
-        /// Writes a byte without any possibility of all that field header nonsense.
-        /// Used internally by other writing methods that know they need to Write a byte.
-        /// </summary>
-        private byte[] byteDirectBuffer = new byte[1];
-
-        private void WriteByteDirect(byte b)
-        {
-            byteDirectBuffer[0] = b;
-            trans.Write(byteDirectBuffer);
-        }
-
-        /// <summary>
-        /// Writes a byte without any possibility of all that field header nonsense.
-        /// </summary>
-        private void WriteByteDirect(int n)
-        {
-            WriteByteDirect((byte)n);
-        }
-
-        /// <summary>
-        /// Write an i32 as a varint. Results in 1-5 bytes on the wire.
-        /// TODO: make a permanent buffer like WriteVarint64?
-        /// </summary>
-        byte[] i32buf = new byte[5];
-
-        private void WriteVarint32(uint n)
-        {
-            int idx = 0;
-            while (true)
-            {
-                if ((n & ~0x7F) == 0)
-                {
-                    i32buf[idx++] = (byte)n;
-                    // WriteByteDirect((byte)n);
-                    break;
-                    // return;
-                }
-                else
-                {
-                    i32buf[idx++] = (byte)((n & 0x7F) | 0x80);
-                    // WriteByteDirect((byte)((n & 0x7F) | 0x80));
-                    n >>= 7;
-                }
-            }
-            trans.Write(i32buf, 0, idx);
-        }
-
-        /// <summary>
-        /// Write a message header to the wire. Compact Protocol messages contain the
-        /// protocol version so we can migrate forwards in the future if need be.
-        /// </summary>
-        public override void WriteMessageBegin(TMessage message)
-        {
-            WriteByteDirect(PROTOCOL_ID);
-            WriteByteDirect((byte)((VERSION & VERSION_MASK) | ((((uint)message.Type) << TYPE_SHIFT_AMOUNT) & TYPE_MASK)));
-            WriteVarint32((uint)message.SeqID);
-            WriteString(message.Name);
-        }
-
-        /// <summary>
-        /// Write a struct begin. This doesn't actually put anything on the wire. We
-        /// use it as an opportunity to put special placeholder markers on the field
-        /// stack so we can get the field id deltas correct.
-        /// </summary>
-        public override void WriteStructBegin(TStruct strct)
-        {
-            lastField_.Push(lastFieldId_);
-            lastFieldId_ = 0;
-        }
-
-        /// <summary>
-        /// Write a struct end. This doesn't actually put anything on the wire. We use
-        /// this as an opportunity to pop the last field from the current struct off
-        /// of the field stack.
-        /// </summary>
-        public override void WriteStructEnd()
-        {
-            lastFieldId_ = lastField_.Pop();
-        }
-
-        /// <summary>
-        /// Write a field header containing the field id and field type. If the
-        /// difference between the current field id and the last one is small (&lt; 15),
-        /// then the field id will be encoded in the 4 MSB as a delta. Otherwise, the
-        /// field id will follow the type header as a zigzag varint.
-        /// </summary>
-        public override void WriteFieldBegin(TField field)
-        {
-            if (field.Type == TType.Bool)
-            {
-                // we want to possibly include the value, so we'll wait.
-                booleanField_ = field;
-            }
-            else
-            {
-                WriteFieldBeginInternal(field, 0xFF);
-            }
-        }
-
-        /// <summary>
-        /// The workhorse of WriteFieldBegin. It has the option of doing a
-        /// 'type override' of the type header. This is used specifically in the
-        /// boolean field case.
-        /// </summary>
-        private void WriteFieldBeginInternal(TField field, byte typeOverride)
-        {
-            // short lastField = lastField_.Pop();
-
-            // if there's a type override, use that.
-            byte typeToWrite = typeOverride == 0xFF ? getCompactType(field.Type) : typeOverride;
-
-            // check if we can use delta encoding for the field id
-            if (field.ID > lastFieldId_ && field.ID - lastFieldId_ <= 15)
-            {
-                // Write them together
-                WriteByteDirect((field.ID - lastFieldId_) << 4 | typeToWrite);
-            }
-            else
-            {
-                // Write them separate
-                WriteByteDirect(typeToWrite);
-                WriteI16(field.ID);
-            }
-
-            lastFieldId_ = field.ID;
-            // lastField_.push(field.id);
-        }
-
-        /// <summary>
-        /// Write the STOP symbol so we know there are no more fields in this struct.
-        /// </summary>
-        public override void WriteFieldStop()
-        {
-            WriteByteDirect(Types.STOP);
-        }
-
-        /// <summary>
-        /// Write a map header. If the map is empty, omit the key and value type
-        /// headers, as we don't need any additional information to skip it.
-        /// </summary>
-        public override void WriteMapBegin(TMap map)
-        {
-            if (map.Count == 0)
-            {
-                WriteByteDirect(0);
-            }
-            else
-            {
-                WriteVarint32((uint)map.Count);
-                WriteByteDirect(getCompactType(map.KeyType) << 4 | getCompactType(map.ValueType));
-            }
-        }
-
-        /// <summary>
-        /// Write a list header.
-        /// </summary>
-        public override void WriteListBegin(TList list)
-        {
-            WriteCollectionBegin(list.ElementType, list.Count);
-        }
-
-        /// <summary>
-        /// Write a set header.
-        /// </summary>
-        public override void WriteSetBegin(TSet set)
-        {
-            WriteCollectionBegin(set.ElementType, set.Count);
-        }
-
-        /// <summary>
-        /// Write a boolean value. Potentially, this could be a boolean field, in
-        /// which case the field header info isn't written yet. If so, decide what the
-        /// right type header is for the value and then Write the field header.
-        /// Otherwise, Write a single byte.
-        /// </summary>
-        public override void WriteBool(Boolean b)
-        {
-            if (booleanField_ != null)
-            {
-                // we haven't written the field header yet
-                WriteFieldBeginInternal(booleanField_.Value, b ? Types.BOOLEAN_TRUE : Types.BOOLEAN_FALSE);
-                booleanField_ = null;
-            }
-            else
-            {
-                // we're not part of a field, so just Write the value.
-                WriteByteDirect(b ? Types.BOOLEAN_TRUE : Types.BOOLEAN_FALSE);
-            }
-        }
-
-        /// <summary>
-        /// Write a byte. Nothing to see here!
-        /// </summary>
-        public override void WriteByte(sbyte b)
-        {
-            WriteByteDirect((byte)b);
-        }
-
-        /// <summary>
-        /// Write an I16 as a zigzag varint.
-        /// </summary>
-        public override void WriteI16(short i16)
-        {
-            WriteVarint32(intToZigZag(i16));
-        }
-
-        /// <summary>
-        /// Write an i32 as a zigzag varint.
-        /// </summary>
-        public override void WriteI32(int i32)
-        {
-            WriteVarint32(intToZigZag(i32));
-        }
-
-        /// <summary>
-        /// Write an i64 as a zigzag varint.
-        /// </summary>
-        public override void WriteI64(long i64)
-        {
-            WriteVarint64(longToZigzag(i64));
-        }
-
-        /// <summary>
-        /// Write a double to the wire as 8 bytes.
-        /// </summary>
-        public override void WriteDouble(double dub)
-        {
-            byte[] data = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 };
-            fixedLongToBytes(BitConverter.DoubleToInt64Bits(dub), data, 0);
-            trans.Write(data);
-        }
-
-        /// <summary>
-        /// Write a string to the wire with a varint size preceding.
-        /// </summary>
-        public override void WriteString(string str)
-        {
-            byte[] bytes = UTF8Encoding.UTF8.GetBytes(str);
-            WriteBinary(bytes, 0, bytes.Length);
-        }
-
-        /// <summary>
-        /// Write a byte array, using a varint for the size.
-        /// </summary>
-        public override void WriteBinary(byte[] bin)
-        {
-            WriteBinary(bin, 0, bin.Length);
-        }
-
-        private void WriteBinary(byte[] buf, int offset, int length)
-        {
-            WriteVarint32((uint)length);
-            trans.Write(buf, offset, length);
-        }
-
-        //
-        // These methods are called by structs, but don't actually have any wire
-        // output or purpose.
-        //
-
-        public override void WriteMessageEnd() { }
-        public override void WriteMapEnd() { }
-        public override void WriteListEnd() { }
-        public override void WriteSetEnd() { }
-        public override void WriteFieldEnd() { }
-
-        //
-        // Internal writing methods
-        //
-
-        /// <summary>
-        /// Abstract method for writing the start of lists and sets. List and sets on
-        /// the wire differ only by the type indicator.
-        /// </summary>
-        protected void WriteCollectionBegin(TType elemType, int size)
-        {
-            if (size <= 14)
-            {
-                WriteByteDirect(size << 4 | getCompactType(elemType));
-            }
-            else
-            {
-                WriteByteDirect(0xf0 | getCompactType(elemType));
-                WriteVarint32((uint)size);
-            }
-        }
-
-        /// <summary>
-        /// Write an i64 as a varint. Results in 1-10 bytes on the wire.
-        /// </summary>
-        byte[] varint64out = new byte[10];
-        private void WriteVarint64(ulong n)
-        {
-            int idx = 0;
-            while (true)
-            {
-                if ((n & ~(ulong)0x7FL) == 0)
-                {
-                    varint64out[idx++] = (byte)n;
-                    break;
-                }
-                else
-                {
-                    varint64out[idx++] = ((byte)((n & 0x7F) | 0x80));
-                    n >>= 7;
-                }
-            }
-            trans.Write(varint64out, 0, idx);
-        }
-
-        /// <summary>
-        /// Convert l into a zigzag long. This allows negative numbers to be
-        /// represented compactly as a varint.
-        /// </summary>
-        private ulong longToZigzag(long n)
-        {
-            return (ulong)(n << 1) ^ (ulong)(n >> 63);
-        }
-
-        /// <summary>
-        /// Convert n into a zigzag int. This allows negative numbers to be
-        /// represented compactly as a varint.
-        /// </summary>
-        private uint intToZigZag(int n)
-        {
-            return (uint)(n << 1) ^ (uint)(n >> 31);
-        }
-
-        /// <summary>
-        /// Convert a long into little-endian bytes in buf starting at off and going
-        /// until off+7.
-        /// </summary>
-        private void fixedLongToBytes(long n, byte[] buf, int off)
-        {
-            buf[off + 0] = (byte)(n & 0xff);
-            buf[off + 1] = (byte)((n >> 8) & 0xff);
-            buf[off + 2] = (byte)((n >> 16) & 0xff);
-            buf[off + 3] = (byte)((n >> 24) & 0xff);
-            buf[off + 4] = (byte)((n >> 32) & 0xff);
-            buf[off + 5] = (byte)((n >> 40) & 0xff);
-            buf[off + 6] = (byte)((n >> 48) & 0xff);
-            buf[off + 7] = (byte)((n >> 56) & 0xff);
-        }
-
-        #endregion
-
-        #region ReadMethods
-
-        /// <summary>
-        /// Read a message header.
-        /// </summary>
-        public override TMessage ReadMessageBegin()
-        {
-            byte protocolId = (byte)ReadByte();
-            if (protocolId != PROTOCOL_ID)
-            {
-                throw new TProtocolException("Expected protocol id " + PROTOCOL_ID.ToString("X") + " but got " + protocolId.ToString("X"));
-            }
-            byte versionAndType = (byte)ReadByte();
-            byte version = (byte)(versionAndType & VERSION_MASK);
-            if (version != VERSION)
-            {
-                throw new TProtocolException("Expected version " + VERSION + " but got " + version);
-            }
-            byte type = (byte)((versionAndType >> TYPE_SHIFT_AMOUNT) & TYPE_BITS);
-            int seqid = (int)ReadVarint32();
-            string messageName = ReadString();
-            return new TMessage(messageName, (TMessageType)type, seqid);
-        }
-
-        /// <summary>
-        /// Read a struct begin. There's nothing on the wire for this, but it is our
-        /// opportunity to push a new struct begin marker onto the field stack.
-        /// </summary>
-        public override TStruct ReadStructBegin()
-        {
-            lastField_.Push(lastFieldId_);
-            lastFieldId_ = 0;
-            return ANONYMOUS_STRUCT;
-        }
-
-        /// <summary>
-        /// Doesn't actually consume any wire data, just removes the last field for
-        /// this struct from the field stack.
-        /// </summary>
-        public override void ReadStructEnd()
-        {
-            // consume the last field we Read off the wire.
-            lastFieldId_ = lastField_.Pop();
-        }
-
-        /// <summary>
-        /// Read a field header off the wire.
-        /// </summary>
-        public override TField ReadFieldBegin()
-        {
-            byte type = (byte)ReadByte();
-
-            // if it's a stop, then we can return immediately, as the struct is over.
-            if (type == Types.STOP)
-            {
-                return TSTOP;
-            }
-
-            short fieldId;
-
-            // mask off the 4 MSB of the type header. it could contain a field id delta.
-            short modifier = (short)((type & 0xf0) >> 4);
-            if (modifier == 0)
-            {
-                // not a delta. look ahead for the zigzag varint field id.
-                fieldId = ReadI16();
-            }
-            else
-            {
-                // has a delta. add the delta to the last Read field id.
-                fieldId = (short)(lastFieldId_ + modifier);
-            }
-
-            TField field = new TField("", getTType((byte)(type & 0x0f)), fieldId);
-
-            // if this happens to be a boolean field, the value is encoded in the type
-            if (isBoolType(type))
-            {
-                // save the boolean value in a special instance variable.
-                boolValue_ = (byte)(type & 0x0f) == Types.BOOLEAN_TRUE ? true : false;
-            }
-
-            // push the new field onto the field stack so we can keep the deltas going.
-            lastFieldId_ = field.ID;
-            return field;
-        }
-
-        /// <summary>
-        /// Read a map header off the wire. If the size is zero, skip Reading the key
-        /// and value type. This means that 0-length maps will yield TMaps without the
-        /// "correct" types.
-        /// </summary>
-        public override TMap ReadMapBegin()
-        {
-            int size = (int)ReadVarint32();
-            byte keyAndValueType = size == 0 ? (byte)0 : (byte)ReadByte();
-            return new TMap(getTType((byte)(keyAndValueType >> 4)), getTType((byte)(keyAndValueType & 0xf)), size);
-        }
-
-        /// <summary>
-        /// Read a list header off the wire. If the list size is 0-14, the size will
-        /// be packed into the element type header. If it's a longer list, the 4 MSB
-        /// of the element type header will be 0xF, and a varint will follow with the
-        /// true size.
-        /// </summary>
-        public override TList ReadListBegin()
-        {
-            byte size_and_type = (byte)ReadByte();
-            int size = (size_and_type >> 4) & 0x0f;
-            if (size == 15)
-            {
-                size = (int)ReadVarint32();
-            }
-            TType type = getTType(size_and_type);
-            return new TList(type, size);
-        }
-
-        /// <summary>
-        /// Read a set header off the wire. If the set size is 0-14, the size will
-        /// be packed into the element type header. If it's a longer set, the 4 MSB
-        /// of the element type header will be 0xF, and a varint will follow with the
-        /// true size.
-        /// </summary>
-        public override TSet ReadSetBegin()
-        {
-            return new TSet(ReadListBegin());
-        }
-
-        /// <summary>
-        /// Read a boolean off the wire. If this is a boolean field, the value should
-        /// already have been Read during ReadFieldBegin, so we'll just consume the
-        /// pre-stored value. Otherwise, Read a byte.
-        /// </summary>
-        public override Boolean ReadBool()
-        {
-            if (boolValue_ != null)
-            {
-                bool result = boolValue_.Value;
-                boolValue_ = null;
-                return result;
-            }
-            return ReadByte() == Types.BOOLEAN_TRUE;
-        }
-
-        byte[] byteRawBuf = new byte[1];
-        /// <summary>
-        /// Read a single byte off the wire. Nothing interesting here.
-        /// </summary>
-        public override sbyte ReadByte()
-        {
-            trans.ReadAll(byteRawBuf, 0, 1);
-            return (sbyte)byteRawBuf[0];
-        }
-
-        /// <summary>
-        /// Read an i16 from the wire as a zigzag varint.
-        /// </summary>
-        public override short ReadI16()
-        {
-            return (short)zigzagToInt(ReadVarint32());
-        }
-
-        /// <summary>
-        /// Read an i32 from the wire as a zigzag varint.
-        /// </summary>
-        public override int ReadI32()
-        {
-            return zigzagToInt(ReadVarint32());
-        }
-
-        /// <summary>
-        /// Read an i64 from the wire as a zigzag varint.
-        /// </summary>
-        public override long ReadI64()
-        {
-            return zigzagToLong(ReadVarint64());
-        }
-
-        /// <summary>
-        /// No magic here - just Read a double off the wire.
-        /// </summary>
-        public override double ReadDouble()
-        {
-            byte[] longBits = new byte[8];
-            trans.ReadAll(longBits, 0, 8);
-            return BitConverter.Int64BitsToDouble(bytesToLong(longBits));
-        }
-
-        /// <summary>
-        /// Reads a byte[] (via ReadBinary), and then UTF-8 decodes it.
-        /// </summary>
-        public override string ReadString()
-        {
-            int length = (int)ReadVarint32();
-
-            if (length == 0)
-            {
-                return "";
-            }
-
-            return Encoding.UTF8.GetString(ReadBinary(length));
-        }
-
-        /// <summary>
-        /// Read a byte[] from the wire.
-        /// </summary>
-        public override byte[] ReadBinary()
-        {
-            int length = (int)ReadVarint32();
-            if (length == 0) return new byte[0];
-
-            byte[] buf = new byte[length];
-            trans.ReadAll(buf, 0, length);
-            return buf;
-        }
-
-        /// <summary>
-        /// Read a byte[] of a known length from the wire.
-        /// </summary>
-        private byte[] ReadBinary(int length)
-        {
-            if (length == 0) return new byte[0];
-
-            byte[] buf = new byte[length];
-            trans.ReadAll(buf, 0, length);
-            return buf;
-        }
-
-        //
-        // These methods are here for the struct to call, but don't have any wire
-        // encoding.
-        //
-        public override void ReadMessageEnd() { }
-        public override void ReadFieldEnd() { }
-        public override void ReadMapEnd() { }
-        public override void ReadListEnd() { }
-        public override void ReadSetEnd() { }
-
-        //
-        // Internal Reading methods
-        //
-
-        /// <summary>
-        /// Read an i32 from the wire as a varint. The MSB of each byte is set
-        /// if there is another byte to follow. This can Read up to 5 bytes.
-        /// </summary>
-        private uint ReadVarint32()
-        {
-            uint result = 0;
-            int shift = 0;
-            while (true)
-            {
-                byte b = (byte)ReadByte();
-                result |= (uint)(b & 0x7f) << shift;
-                if ((b & 0x80) != 0x80) break;
-                shift += 7;
-            }
-            return result;
-        }
-
-        /// <summary>
-        /// Read an i64 from the wire as a proper varint. The MSB of each byte is set
-        /// if there is another byte to follow. This can Read up to 10 bytes.
-        /// </summary>
-        private ulong ReadVarint64()
-        {
-            int shift = 0;
-            ulong result = 0;
-            while (true)
-            {
-                byte b = (byte)ReadByte();
-                result |= (ulong)(b & 0x7f) << shift;
-                if ((b & 0x80) != 0x80) break;
-                shift += 7;
-            }
-
-            return result;
-        }
-
-        #endregion
-
-        //
-        // encoding helpers
-        //
-
-        /// <summary>
-        /// Convert from zigzag int to int.
-        /// </summary>
-        private int zigzagToInt(uint n)
-        {
-            return (int)(n >> 1) ^ (-(int)(n & 1));
-        }
-
-        /// <summary>
-        /// Convert from zigzag long to long.
-        /// </summary>
-        private long zigzagToLong(ulong n)
-        {
-            return (long)(n >> 1) ^ (-(long)(n & 1));
-        }
-
-        /// <summary>
-        /// Note that it's important that the mask bytes are long literals,
-        /// otherwise they'll default to ints, and when you shift an int left 56 bits,
-        /// you just get a messed up int.
-        /// </summary>
-        private long bytesToLong(byte[] bytes)
-        {
-            return
-              ((bytes[7] & 0xffL) << 56) |
-              ((bytes[6] & 0xffL) << 48) |
-              ((bytes[5] & 0xffL) << 40) |
-              ((bytes[4] & 0xffL) << 32) |
-              ((bytes[3] & 0xffL) << 24) |
-              ((bytes[2] & 0xffL) << 16) |
-              ((bytes[1] & 0xffL) << 8) |
-              ((bytes[0] & 0xffL));
-        }
-
-        //
-        // type testing and converting
-        //
-
-        private Boolean isBoolType(byte b)
-        {
-            int lowerNibble = b & 0x0f;
-            return lowerNibble == Types.BOOLEAN_TRUE || lowerNibble == Types.BOOLEAN_FALSE;
-        }
-
-        /// <summary>
-        /// Given a TCompactProtocol.Types constant, convert it to its corresponding
-        /// TType value.
-        /// </summary>
-        private TType getTType(byte type)
-        {
-            switch ((byte)(type & 0x0f))
-            {
-                case Types.STOP:
-                    return TType.Stop;
-                case Types.BOOLEAN_FALSE:
-                case Types.BOOLEAN_TRUE:
-                    return TType.Bool;
-                case Types.BYTE:
-                    return TType.Byte;
-                case Types.I16:
-                    return TType.I16;
-                case Types.I32:
-                    return TType.I32;
-                case Types.I64:
-                    return TType.I64;
-                case Types.DOUBLE:
-                    return TType.Double;
-                case Types.BINARY:
-                    return TType.String;
-                case Types.LIST:
-                    return TType.List;
-                case Types.SET:
-                    return TType.Set;
-                case Types.MAP:
-                    return TType.Map;
-                case Types.STRUCT:
-                    return TType.Struct;
-                default:
-                    throw new TProtocolException("don't know what type: " + (byte)(type & 0x0f));
-            }
-        }
-
-        /// <summary>
-        /// Given a TType value, find the appropriate TCompactProtocol.Types constant.
-        /// </summary>
-        private byte getCompactType(TType ttype)
-        {
-            return ttypeToCompactType[(int)ttype];
-        }
-    }
-}
diff --git a/lib/csharp/src/Protocol/TField.cs b/lib/csharp/src/Protocol/TField.cs
deleted file mode 100644
index 8179557..0000000
--- a/lib/csharp/src/Protocol/TField.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Thrift.Protocol
-{
-    public struct TField
-    {
-        private string name;
-        private TType type;
-        private short id;
-
-        public TField(string name, TType type, short id)
-            :this()
-        {
-            this.name = name;
-            this.type = type;
-            this.id = id;
-        }
-
-        public string Name
-        {
-            get { return name; }
-            set { name = value; }
-        }
-
-        public TType Type
-        {
-            get { return type; }
-            set { type = value; }
-        }
-
-        public short ID
-        {
-            get { return id; }
-            set { id = value; }
-        }
-    }
-}
diff --git a/lib/csharp/src/Protocol/TJSONProtocol.cs b/lib/csharp/src/Protocol/TJSONProtocol.cs
deleted file mode 100644
index 9dbdea9..0000000
--- a/lib/csharp/src/Protocol/TJSONProtocol.cs
+++ /dev/null
@@ -1,1124 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System;
-using System.IO;
-using System.Text;
-using System.Collections.Generic;
-
-using Thrift.Transport;
-using System.Globalization;
-
-namespace Thrift.Protocol
-{
-    /// <summary>
-    /// JSON protocol implementation for thrift.
-    /// <para/>
-    /// This is a full-featured protocol supporting Write and Read.
-    /// <para/>
-    /// Please see the C++ class header for a detailed description of the
-    /// protocol's wire format.
-    /// <para/>
-    /// Adapted from the Java version.
-    /// </summary>
-    public class TJSONProtocol : TProtocol
-    {
-        /// <summary>
-        /// Factory for JSON protocol objects.
-        /// </summary>
-        public class Factory : TProtocolFactory
-        {
-            public TProtocol GetProtocol(TTransport trans)
-            {
-                return new TJSONProtocol(trans);
-            }
-        }
-
-        private static byte[] COMMA = new byte[] { (byte)',' };
-        private static byte[] COLON = new byte[] { (byte)':' };
-        private static byte[] LBRACE = new byte[] { (byte)'{' };
-        private static byte[] RBRACE = new byte[] { (byte)'}' };
-        private static byte[] LBRACKET = new byte[] { (byte)'[' };
-        private static byte[] RBRACKET = new byte[] { (byte)']' };
-        private static byte[] QUOTE = new byte[] { (byte)'"' };
-        private static byte[] BACKSLASH = new byte[] { (byte)'\\' };
-
-        private byte[] ESCSEQ = new byte[] { (byte)'\\', (byte)'u', (byte)'0', (byte)'0' };
-
-        private const long VERSION = 1;
-        private byte[] JSON_CHAR_TABLE = {
-    0,  0,  0,  0,  0,  0,  0,  0,(byte)'b',(byte)'t',(byte)'n',  0,(byte)'f',(byte)'r',  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    1,  1,(byte)'"',  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-  };
-
-        private char[] ESCAPE_CHARS = "\"\\/bfnrt".ToCharArray();
-
-        private byte[] ESCAPE_CHAR_VALS = {
-    (byte)'"', (byte)'\\', (byte)'/', (byte)'\b', (byte)'\f', (byte)'\n', (byte)'\r', (byte)'\t',
-  };
-
-        private const int DEF_STRING_SIZE = 16;
-
-        private static byte[] NAME_BOOL = new byte[] { (byte)'t', (byte)'f' };
-        private static byte[] NAME_BYTE = new byte[] { (byte)'i', (byte)'8' };
-        private static byte[] NAME_I16 = new byte[] { (byte)'i', (byte)'1', (byte)'6' };
-        private static byte[] NAME_I32 = new byte[] { (byte)'i', (byte)'3', (byte)'2' };
-        private static byte[] NAME_I64 = new byte[] { (byte)'i', (byte)'6', (byte)'4' };
-        private static byte[] NAME_DOUBLE = new byte[] { (byte)'d', (byte)'b', (byte)'l' };
-        private static byte[] NAME_STRUCT = new byte[] { (byte)'r', (byte)'e', (byte)'c' };
-        private static byte[] NAME_STRING = new byte[] { (byte)'s', (byte)'t', (byte)'r' };
-        private static byte[] NAME_MAP = new byte[] { (byte)'m', (byte)'a', (byte)'p' };
-        private static byte[] NAME_LIST = new byte[] { (byte)'l', (byte)'s', (byte)'t' };
-        private static byte[] NAME_SET = new byte[] { (byte)'s', (byte)'e', (byte)'t' };
-
-        private static byte[] GetTypeNameForTypeID(TType typeID)
-        {
-            switch (typeID)
-            {
-                case TType.Bool:
-                    return NAME_BOOL;
-                case TType.Byte:
-                    return NAME_BYTE;
-                case TType.I16:
-                    return NAME_I16;
-                case TType.I32:
-                    return NAME_I32;
-                case TType.I64:
-                    return NAME_I64;
-                case TType.Double:
-                    return NAME_DOUBLE;
-                case TType.String:
-                    return NAME_STRING;
-                case TType.Struct:
-                    return NAME_STRUCT;
-                case TType.Map:
-                    return NAME_MAP;
-                case TType.Set:
-                    return NAME_SET;
-                case TType.List:
-                    return NAME_LIST;
-                default:
-                    throw new TProtocolException(TProtocolException.NOT_IMPLEMENTED,
-                                                 "Unrecognized type");
-            }
-        }
-
-        private static TType GetTypeIDForTypeName(byte[] name)
-        {
-            TType result = TType.Stop;
-            if (name.Length > 1)
-            {
-                switch (name[0])
-                {
-                    case (byte)'d':
-                        result = TType.Double;
-                        break;
-                    case (byte)'i':
-                        switch (name[1])
-                        {
-                            case (byte)'8':
-                                result = TType.Byte;
-                                break;
-                            case (byte)'1':
-                                result = TType.I16;
-                                break;
-                            case (byte)'3':
-                                result = TType.I32;
-                                break;
-                            case (byte)'6':
-                                result = TType.I64;
-                                break;
-                        }
-                        break;
-                    case (byte)'l':
-                        result = TType.List;
-                        break;
-                    case (byte)'m':
-                        result = TType.Map;
-                        break;
-                    case (byte)'r':
-                        result = TType.Struct;
-                        break;
-                    case (byte)'s':
-                        if (name[1] == (byte)'t')
-                        {
-                            result = TType.String;
-                        }
-                        else if (name[1] == (byte)'e')
-                        {
-                            result = TType.Set;
-                        }
-                        break;
-                    case (byte)'t':
-                        result = TType.Bool;
-                        break;
-                }
-            }
-            if (result == TType.Stop)
-            {
-                throw new TProtocolException(TProtocolException.NOT_IMPLEMENTED,
-                                             "Unrecognized type");
-            }
-            return result;
-        }
-
-        /// <summary>
-        /// Base class for tracking JSON contexts that may require
-        /// inserting/Reading additional JSON syntax characters
-        /// This base context does nothing.
-        /// </summary>
-        protected class JSONBaseContext
-        {
-            protected TJSONProtocol proto;
-
-            public JSONBaseContext(TJSONProtocol proto)
-            {
-                this.proto = proto;
-            }
-
-            public virtual void Write() { }
-
-            public virtual void Read() { }
-
-            public virtual bool EscapeNumbers() { return false; }
-        }
-
-        /// <summary>
-        /// Context for JSON lists. Will insert/Read commas before each item except
-        /// for the first one
-        /// </summary>
-        protected class JSONListContext : JSONBaseContext
-        {
-            public JSONListContext(TJSONProtocol protocol)
-                : base(protocol)
-            {
-
-            }
-
-            private bool first = true;
-
-            public override void Write()
-            {
-                if (first)
-                {
-                    first = false;
-                }
-                else
-                {
-                    proto.trans.Write(COMMA);
-                }
-            }
-
-            public override void Read()
-            {
-                if (first)
-                {
-                    first = false;
-                }
-                else
-                {
-                    proto.ReadJSONSyntaxChar(COMMA);
-                }
-            }
-        }
-
-        /// <summary>
-        /// Context for JSON records. Will insert/Read colons before the value portion
-        /// of each record pair, and commas before each key except the first. In
-        /// addition, will indicate that numbers in the key position need to be
-        /// escaped in quotes (since JSON keys must be strings).
-        /// </summary>
-        protected class JSONPairContext : JSONBaseContext
-        {
-            public JSONPairContext(TJSONProtocol proto)
-                : base(proto)
-            {
-
-            }
-
-            private bool first = true;
-            private bool colon = true;
-
-            public override void Write()
-            {
-                if (first)
-                {
-                    first = false;
-                    colon = true;
-                }
-                else
-                {
-                    proto.trans.Write(colon ? COLON : COMMA);
-                    colon = !colon;
-                }
-            }
-
-            public override void Read()
-            {
-                if (first)
-                {
-                    first = false;
-                    colon = true;
-                }
-                else
-                {
-                    proto.ReadJSONSyntaxChar(colon ? COLON : COMMA);
-                    colon = !colon;
-                }
-            }
-
-            public override bool EscapeNumbers()
-            {
-                return colon;
-            }
-        }
-
-        /// <summary>
-        /// Holds up to one byte from the transport
-        /// </summary>
-        protected class LookaheadReader
-        {
-            protected TJSONProtocol proto;
-
-            public LookaheadReader(TJSONProtocol proto)
-            {
-                this.proto = proto;
-            }
-
-            private bool hasData;
-            private byte[] data = new byte[1];
-
-            /// <summary>
-            /// Return and consume the next byte to be Read, either taking it from the
-            /// data buffer if present or getting it from the transport otherwise.
-            /// </summary>
-            public byte Read()
-            {
-                if (hasData)
-                {
-                    hasData = false;
-                }
-                else
-                {
-                    proto.trans.ReadAll(data, 0, 1);
-                }
-                return data[0];
-            }
-
-            /// <summary>
-            /// Return the next byte to be Read without consuming, filling the data
-            /// buffer if it has not been filled alReady.
-            /// </summary>
-            public byte Peek()
-            {
-                if (!hasData)
-                {
-                    proto.trans.ReadAll(data, 0, 1);
-                }
-                hasData = true;
-                return data[0];
-            }
-        }
-
-        // Default encoding
-        protected Encoding utf8Encoding = UTF8Encoding.UTF8;
-
-        // Stack of nested contexts that we may be in
-        protected Stack<JSONBaseContext> contextStack = new Stack<JSONBaseContext>();
-
-        // Current context that we are in
-        protected JSONBaseContext context;
-
-        // Reader that manages a 1-byte buffer
-        protected LookaheadReader reader;
-
-        /// <summary>
-        /// Push a new JSON context onto the stack.
-        /// </summary>
-        protected void PushContext(JSONBaseContext c)
-        {
-            contextStack.Push(context);
-            context = c;
-        }
-
-        /// <summary>
-        /// Pop the last JSON context off the stack
-        /// </summary>
-        protected void PopContext()
-        {
-            context = contextStack.Pop();
-        }
-
-        /// <summary>
-        /// TJSONProtocol Constructor
-        /// </summary>
-        public TJSONProtocol(TTransport trans)
-            : base(trans)
-        {
-            context = new JSONBaseContext(this);
-            reader = new LookaheadReader(this);
-        }
-
-        // Temporary buffer used by several methods
-        private byte[] tempBuffer = new byte[4];
-
-        /// <summary>
-        /// Read a byte that must match b[0]; otherwise an exception is thrown.
-        /// Marked protected to avoid synthetic accessor in JSONListContext.Read
-        /// and JSONPairContext.Read
-        /// </summary>
-        protected void ReadJSONSyntaxChar(byte[] b)
-        {
-            byte ch = reader.Read();
-            if (ch != b[0])
-            {
-                throw new TProtocolException(TProtocolException.INVALID_DATA,
-                                             "Unexpected character:" + (char)ch);
-            }
-        }
-
-        /// <summary>
-        /// Convert a byte containing a hex char ('0'-'9' or 'a'-'f') into its
-        /// corresponding hex value
-        /// </summary>
-        private static byte HexVal(byte ch)
-        {
-            if ((ch >= '0') && (ch <= '9'))
-            {
-                return (byte)((char)ch - '0');
-            }
-            else if ((ch >= 'a') && (ch <= 'f'))
-            {
-                ch += 10;
-                return (byte)((char)ch - 'a');
-            }
-            else
-            {
-                throw new TProtocolException(TProtocolException.INVALID_DATA,
-                                             "Expected hex character");
-            }
-        }
-
-        /// <summary>
-        /// Convert a byte containing a hex value to its corresponding hex character
-        /// </summary>
-        private static byte HexChar(byte val)
-        {
-            val &= 0x0F;
-            if (val < 10)
-            {
-                return (byte)((char)val + '0');
-            }
-            else
-            {
-                val -= 10;
-                return (byte)((char)val + 'a');
-            }
-        }
-
-        /// <summary>
-        /// Write the bytes in array buf as a JSON characters, escaping as needed
-        /// </summary>
-        private void WriteJSONString(byte[] b)
-        {
-            context.Write();
-            trans.Write(QUOTE);
-            int len = b.Length;
-            for (int i = 0; i < len; i++)
-            {
-                if ((b[i] & 0x00FF) >= 0x30)
-                {
-                    if (b[i] == BACKSLASH[0])
-                    {
-                        trans.Write(BACKSLASH);
-                        trans.Write(BACKSLASH);
-                    }
-                    else
-                    {
-                        trans.Write(b, i, 1);
-                    }
-                }
-                else
-                {
-                    tempBuffer[0] = JSON_CHAR_TABLE[b[i]];
-                    if (tempBuffer[0] == 1)
-                    {
-                        trans.Write(b, i, 1);
-                    }
-                    else if (tempBuffer[0] > 1)
-                    {
-                        trans.Write(BACKSLASH);
-                        trans.Write(tempBuffer, 0, 1);
-                    }
-                    else
-                    {
-                        trans.Write(ESCSEQ);
-                        tempBuffer[0] = HexChar((byte)(b[i] >> 4));
-                        tempBuffer[1] = HexChar(b[i]);
-                        trans.Write(tempBuffer, 0, 2);
-                    }
-                }
-            }
-            trans.Write(QUOTE);
-        }
-
-        /// <summary>
-        /// Write out number as a JSON value. If the context dictates so, it will be
-        /// wrapped in quotes to output as a JSON string.
-        /// </summary>
-        private void WriteJSONInteger(long num)
-        {
-            context.Write();
-            string str = num.ToString();
-
-            bool escapeNum = context.EscapeNumbers();
-            if (escapeNum)
-                trans.Write(QUOTE);
-
-            trans.Write(utf8Encoding.GetBytes(str));
-
-            if (escapeNum)
-                trans.Write(QUOTE);
-        }
-
-        /// <summary>
-        /// Write out a double as a JSON value. If it is NaN or infinity or if the
-        /// context dictates escaping, Write out as JSON string.
-        /// </summary>
-        private void WriteJSONDouble(double num)
-        {
-            context.Write();
-            string str = num.ToString("G17", CultureInfo.InvariantCulture);
-            bool special = false;
-
-            switch (str[0])
-            {
-                case 'N': // NaN
-                case 'I': // Infinity
-                    special = true;
-                    break;
-                case '-':
-                    if (str[1] == 'I')
-                    { // -Infinity
-                        special = true;
-                    }
-                    break;
-            }
-
-            bool escapeNum = special || context.EscapeNumbers();
-
-            if (escapeNum)
-                trans.Write(QUOTE);
-
-            trans.Write(utf8Encoding.GetBytes(str));
-
-            if (escapeNum)
-                trans.Write(QUOTE);
-        }
-        /// <summary>
-        /// Write out contents of byte array b as a JSON string with base-64 encoded
-        /// data
-        /// </summary>
-        private void WriteJSONBase64(byte[] b)
-        {
-            context.Write();
-            trans.Write(QUOTE);
-
-            int len = b.Length;
-            int off = 0;
-
-            while (len >= 3)
-            {
-                // Encode 3 bytes at a time
-                TBase64Utils.encode(b, off, 3, tempBuffer, 0);
-                trans.Write(tempBuffer, 0, 4);
-                off += 3;
-                len -= 3;
-            }
-            if (len > 0)
-            {
-                // Encode remainder
-                TBase64Utils.encode(b, off, len, tempBuffer, 0);
-                trans.Write(tempBuffer, 0, len + 1);
-            }
-
-            trans.Write(QUOTE);
-        }
-
-        private void WriteJSONObjectStart()
-        {
-            context.Write();
-            trans.Write(LBRACE);
-            PushContext(new JSONPairContext(this));
-        }
-
-        private void WriteJSONObjectEnd()
-        {
-            PopContext();
-            trans.Write(RBRACE);
-        }
-
-        private void WriteJSONArrayStart()
-        {
-            context.Write();
-            trans.Write(LBRACKET);
-            PushContext(new JSONListContext(this));
-        }
-
-        private void WriteJSONArrayEnd()
-        {
-            PopContext();
-            trans.Write(RBRACKET);
-        }
-
-        public override void WriteMessageBegin(TMessage message)
-        {
-            WriteJSONArrayStart();
-            WriteJSONInteger(VERSION);
-
-            byte[] b = utf8Encoding.GetBytes(message.Name);
-            WriteJSONString(b);
-
-            WriteJSONInteger((long)message.Type);
-            WriteJSONInteger(message.SeqID);
-        }
-
-        public override void WriteMessageEnd()
-        {
-            WriteJSONArrayEnd();
-        }
-
-        public override void WriteStructBegin(TStruct str)
-        {
-            WriteJSONObjectStart();
-        }
-
-        public override void WriteStructEnd()
-        {
-            WriteJSONObjectEnd();
-        }
-
-        public override void WriteFieldBegin(TField field)
-        {
-            WriteJSONInteger(field.ID);
-            WriteJSONObjectStart();
-            WriteJSONString(GetTypeNameForTypeID(field.Type));
-        }
-
-        public override void WriteFieldEnd()
-        {
-            WriteJSONObjectEnd();
-        }
-
-        public override void WriteFieldStop() { }
-
-        public override void WriteMapBegin(TMap map)
-        {
-            WriteJSONArrayStart();
-            WriteJSONString(GetTypeNameForTypeID(map.KeyType));
-            WriteJSONString(GetTypeNameForTypeID(map.ValueType));
-            WriteJSONInteger(map.Count);
-            WriteJSONObjectStart();
-        }
-
-        public override void WriteMapEnd()
-        {
-            WriteJSONObjectEnd();
-            WriteJSONArrayEnd();
-        }
-
-        public override void WriteListBegin(TList list)
-        {
-            WriteJSONArrayStart();
-            WriteJSONString(GetTypeNameForTypeID(list.ElementType));
-            WriteJSONInteger(list.Count);
-        }
-
-        public override void WriteListEnd()
-        {
-            WriteJSONArrayEnd();
-        }
-
-        public override void WriteSetBegin(TSet set)
-        {
-            WriteJSONArrayStart();
-            WriteJSONString(GetTypeNameForTypeID(set.ElementType));
-            WriteJSONInteger(set.Count);
-        }
-
-        public override void WriteSetEnd()
-        {
-            WriteJSONArrayEnd();
-        }
-
-        public override void WriteBool(bool b)
-        {
-            WriteJSONInteger(b ? (long)1 : (long)0);
-        }
-
-        public override void WriteByte(sbyte b)
-        {
-            WriteJSONInteger((long)b);
-        }
-
-        public override void WriteI16(short i16)
-        {
-            WriteJSONInteger((long)i16);
-        }
-
-        public override void WriteI32(int i32)
-        {
-            WriteJSONInteger((long)i32);
-        }
-
-        public override void WriteI64(long i64)
-        {
-            WriteJSONInteger(i64);
-        }
-
-        public override void WriteDouble(double dub)
-        {
-            WriteJSONDouble(dub);
-        }
-
-        public override void WriteString(string str)
-        {
-            byte[] b = utf8Encoding.GetBytes(str);
-            WriteJSONString(b);
-        }
-
-        public override void WriteBinary(byte[] bin)
-        {
-            WriteJSONBase64(bin);
-        }
-
-        /**
-         * Reading methods.
-         */
-
-        /// <summary>
-        /// Read in a JSON string, unescaping as appropriate.. Skip Reading from the
-        /// context if skipContext is true.
-        /// </summary>
-        private byte[] ReadJSONString(bool skipContext)
-        {
-            MemoryStream buffer = new MemoryStream();
-            List<char> codeunits = new List<char>();
-
-
-            if (!skipContext)
-            {
-                context.Read();
-            }
-            ReadJSONSyntaxChar(QUOTE);
-            while (true)
-            {
-                byte ch = reader.Read();
-                if (ch == QUOTE[0])
-                {
-                    break;
-                }
-
-                // escaped?
-                if (ch != ESCSEQ[0])
-                {
-                    buffer.Write(new byte[] { (byte)ch }, 0, 1);
-                    continue;
-                }
-
-                // distinguish between \uXXXX and \?
-                ch = reader.Read();
-                if (ch != ESCSEQ[1])  // control chars like \n
-                {
-                    int off = Array.IndexOf(ESCAPE_CHARS, (char)ch);
-                    if (off == -1)
-                    {
-                        throw new TProtocolException(TProtocolException.INVALID_DATA,
-                                                        "Expected control char");
-                    }
-                    ch = ESCAPE_CHAR_VALS[off];
-                    buffer.Write(new byte[] { (byte)ch }, 0, 1);
-                    continue;
-                }
-
-
-                // it's \uXXXX
-                trans.ReadAll(tempBuffer, 0, 4);
-                var wch = (short)((HexVal((byte)tempBuffer[0]) << 12) +
-                                  (HexVal((byte)tempBuffer[1]) << 8) +
-                                  (HexVal((byte)tempBuffer[2]) << 4) +
-                                   HexVal(tempBuffer[3]));
-                if (Char.IsHighSurrogate((char)wch))
-                {
-                    if (codeunits.Count > 0)
-                    {
-                        throw new TProtocolException(TProtocolException.INVALID_DATA,
-                                                        "Expected low surrogate char");
-                    }
-                    codeunits.Add((char)wch);
-                }
-                else if (Char.IsLowSurrogate((char)wch))
-                {
-                    if (codeunits.Count == 0)
-                    {
-                        throw new TProtocolException(TProtocolException.INVALID_DATA,
-                                                        "Expected high surrogate char");
-                    }
-                    codeunits.Add((char)wch);
-                    var tmp = utf8Encoding.GetBytes(codeunits.ToArray());
-                    buffer.Write(tmp, 0, tmp.Length);
-                    codeunits.Clear();
-                }
-                else
-                {
-                    var tmp = utf8Encoding.GetBytes(new char[] { (char)wch });
-                    buffer.Write(tmp, 0, tmp.Length);
-                }
-            }
-
-
-            if (codeunits.Count > 0)
-            {
-                throw new TProtocolException(TProtocolException.INVALID_DATA,
-                                                "Expected low surrogate char");
-            }
-
-            return buffer.ToArray();
-        }
-
-        /// <summary>
-        /// Return true if the given byte could be a valid part of a JSON number.
-        /// </summary>
-        private bool IsJSONNumeric(byte b)
-        {
-            switch (b)
-            {
-                case (byte)'+':
-                case (byte)'-':
-                case (byte)'.':
-                case (byte)'0':
-                case (byte)'1':
-                case (byte)'2':
-                case (byte)'3':
-                case (byte)'4':
-                case (byte)'5':
-                case (byte)'6':
-                case (byte)'7':
-                case (byte)'8':
-                case (byte)'9':
-                case (byte)'E':
-                case (byte)'e':
-                    return true;
-            }
-            return false;
-        }
-
-        /// <summary>
-        /// Read in a sequence of characters that are all valid in JSON numbers. Does
-        /// not do a complete regex check to validate that this is actually a number.
-        /// </summary>
-        private string ReadJSONNumericChars()
-        {
-            StringBuilder strbld = new StringBuilder();
-            while (true)
-            {
-                byte ch = reader.Peek();
-                if (!IsJSONNumeric(ch))
-                {
-                    break;
-                }
-                strbld.Append((char)reader.Read());
-            }
-            return strbld.ToString();
-        }
-
-        /// <summary>
-        /// Read in a JSON number. If the context dictates, Read in enclosing quotes.
-        /// </summary>
-        private long ReadJSONInteger()
-        {
-            context.Read();
-            if (context.EscapeNumbers())
-            {
-                ReadJSONSyntaxChar(QUOTE);
-            }
-
-            string str = ReadJSONNumericChars();
-            if (context.EscapeNumbers())
-            {
-                ReadJSONSyntaxChar(QUOTE);
-            }
-
-            try
-            {
-                return Int64.Parse(str);
-            }
-            catch (FormatException fex)
-            {
-                throw new TProtocolException(TProtocolException.INVALID_DATA,
-                                             "Bad data encounted in numeric data", fex);
-            }
-        }
-
-        /// <summary>
-        /// Read in a JSON double value. Throw if the value is not wrapped in quotes
-        /// when expected or if wrapped in quotes when not expected.
-        /// </summary>
-        private double ReadJSONDouble()
-        {
-            context.Read();
-            if (reader.Peek() == QUOTE[0])
-            {
-                byte[] arr = ReadJSONString(true);
-                double dub = Double.Parse(utf8Encoding.GetString(arr, 0, arr.Length), CultureInfo.InvariantCulture);
-
-                if (!context.EscapeNumbers() && !Double.IsNaN(dub) && !Double.IsInfinity(dub))
-                {
-                    // Throw exception -- we should not be in a string in this case
-                    throw new TProtocolException(TProtocolException.INVALID_DATA,
-                                                 "Numeric data unexpectedly quoted");
-                }
-                return dub;
-            }
-            else
-            {
-                if (context.EscapeNumbers())
-                {
-                    // This will throw - we should have had a quote if escapeNum == true
-                    ReadJSONSyntaxChar(QUOTE);
-                }
-                try
-                {
-                    return Double.Parse(ReadJSONNumericChars(), CultureInfo.InvariantCulture);
-                }
-                catch (FormatException fex)
-                {
-                    throw new TProtocolException(TProtocolException.INVALID_DATA,
-                                                 "Bad data encounted in numeric data", fex);
-                }
-            }
-        }
-
-        /// <summary>
-        /// Read in a JSON string containing base-64 encoded data and decode it.
-        /// </summary>
-        private byte[] ReadJSONBase64()
-        {
-            byte[] b = ReadJSONString(false);
-            int len = b.Length;
-            int off = 0;
-            int size = 0;
-            // reduce len to ignore fill bytes
-            while ((len > 0) && (b[len - 1] == '='))
-            {
-                --len;
-            }
-            // read & decode full byte triplets = 4 source bytes
-            while (len > 4)
-            {
-                // Decode 4 bytes at a time
-                TBase64Utils.decode(b, off, 4, b, size); // NB: decoded in place
-                off += 4;
-                len -= 4;
-                size += 3;
-            }
-            // Don't decode if we hit the end or got a single leftover byte (invalid
-            // base64 but legal for skip of regular string type)
-            if (len > 1)
-            {
-                // Decode remainder
-                TBase64Utils.decode(b, off, len, b, size); // NB: decoded in place
-                size += len - 1;
-            }
-            // Sadly we must copy the byte[] (any way around this?)
-            byte[] result = new byte[size];
-            Array.Copy(b, 0, result, 0, size);
-            return result;
-        }
-
-        private void ReadJSONObjectStart()
-        {
-            context.Read();
-            ReadJSONSyntaxChar(LBRACE);
-            PushContext(new JSONPairContext(this));
-        }
-
-        private void ReadJSONObjectEnd()
-        {
-            ReadJSONSyntaxChar(RBRACE);
-            PopContext();
-        }
-
-        private void ReadJSONArrayStart()
-        {
-            context.Read();
-            ReadJSONSyntaxChar(LBRACKET);
-            PushContext(new JSONListContext(this));
-        }
-
-        private void ReadJSONArrayEnd()
-        {
-            ReadJSONSyntaxChar(RBRACKET);
-            PopContext();
-        }
-
-        public override TMessage ReadMessageBegin()
-        {
-            TMessage message = new TMessage();
-            ReadJSONArrayStart();
-            if (ReadJSONInteger() != VERSION)
-            {
-                throw new TProtocolException(TProtocolException.BAD_VERSION,
-                                             "Message contained bad version.");
-            }
-
-            var buf = ReadJSONString(false);
-            message.Name = utf8Encoding.GetString(buf, 0, buf.Length);
-            message.Type = (TMessageType)ReadJSONInteger();
-            message.SeqID = (int)ReadJSONInteger();
-            return message;
-        }
-
-        public override void ReadMessageEnd()
-        {
-            ReadJSONArrayEnd();
-        }
-
-        public override TStruct ReadStructBegin()
-        {
-            ReadJSONObjectStart();
-            return new TStruct();
-        }
-
-        public override void ReadStructEnd()
-        {
-            ReadJSONObjectEnd();
-        }
-
-        public override TField ReadFieldBegin()
-        {
-            TField field = new TField();
-            byte ch = reader.Peek();
-            if (ch == RBRACE[0])
-            {
-                field.Type = TType.Stop;
-            }
-            else
-            {
-                field.ID = (short)ReadJSONInteger();
-                ReadJSONObjectStart();
-                field.Type = GetTypeIDForTypeName(ReadJSONString(false));
-            }
-            return field;
-        }
-
-        public override void ReadFieldEnd()
-        {
-            ReadJSONObjectEnd();
-        }
-
-        public override TMap ReadMapBegin()
-        {
-            TMap map = new TMap();
-            ReadJSONArrayStart();
-            map.KeyType = GetTypeIDForTypeName(ReadJSONString(false));
-            map.ValueType = GetTypeIDForTypeName(ReadJSONString(false));
-            map.Count = (int)ReadJSONInteger();
-            ReadJSONObjectStart();
-            return map;
-        }
-
-        public override void ReadMapEnd()
-        {
-            ReadJSONObjectEnd();
-            ReadJSONArrayEnd();
-        }
-
-        public override TList ReadListBegin()
-        {
-            TList list = new TList();
-            ReadJSONArrayStart();
-            list.ElementType = GetTypeIDForTypeName(ReadJSONString(false));
-            list.Count = (int)ReadJSONInteger();
-            return list;
-        }
-
-        public override void ReadListEnd()
-        {
-            ReadJSONArrayEnd();
-        }
-
-        public override TSet ReadSetBegin()
-        {
-            TSet set = new TSet();
-            ReadJSONArrayStart();
-            set.ElementType = GetTypeIDForTypeName(ReadJSONString(false));
-            set.Count = (int)ReadJSONInteger();
-            return set;
-        }
-
-        public override void ReadSetEnd()
-        {
-            ReadJSONArrayEnd();
-        }
-
-        public override bool ReadBool()
-        {
-            return (ReadJSONInteger() == 0 ? false : true);
-        }
-
-        public override sbyte ReadByte()
-        {
-            return (sbyte)ReadJSONInteger();
-        }
-
-        public override short ReadI16()
-        {
-            return (short)ReadJSONInteger();
-        }
-
-        public override int ReadI32()
-        {
-            return (int)ReadJSONInteger();
-        }
-
-        public override long ReadI64()
-        {
-            return (long)ReadJSONInteger();
-        }
-
-        public override double ReadDouble()
-        {
-            return ReadJSONDouble();
-        }
-
-        public override string ReadString()
-        {
-            var buf = ReadJSONString(false);
-            return utf8Encoding.GetString(buf, 0, buf.Length);
-        }
-
-        public override byte[] ReadBinary()
-        {
-            return ReadJSONBase64();
-        }
-
-    }
-}
diff --git a/lib/csharp/src/Protocol/TList.cs b/lib/csharp/src/Protocol/TList.cs
deleted file mode 100644
index 0c8f214..0000000
--- a/lib/csharp/src/Protocol/TList.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Thrift.Protocol
-{
-    public struct TList
-    {
-        private TType elementType;
-        private int count;
-
-        public TList(TType elementType, int count)
-            :this()
-        {
-            this.elementType = elementType;
-            this.count = count;
-        }
-
-        public TType ElementType
-        {
-            get { return elementType; }
-            set { elementType = value; }
-        }
-
-        public int Count
-        {
-            get { return count; }
-            set { count = value; }
-        }
-    }
-}
diff --git a/lib/csharp/src/Protocol/TMap.cs b/lib/csharp/src/Protocol/TMap.cs
deleted file mode 100644
index aba9d3a..0000000
--- a/lib/csharp/src/Protocol/TMap.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Thrift.Protocol
-{
-    public struct TMap
-    {
-        private TType keyType;
-        private TType valueType;
-        private int count;
-
-        public TMap(TType keyType, TType valueType, int count)
-            :this()
-        {
-            this.keyType = keyType;
-            this.valueType = valueType;
-            this.count = count;
-        }
-
-        public TType KeyType
-        {
-            get { return keyType; }
-            set { keyType = value; }
-        }
-
-        public TType ValueType
-        {
-            get { return valueType; }
-            set { valueType = value; }
-        }
-
-        public int Count
-        {
-            get { return count; }
-            set { count = value; }
-        }
-    }
-}
diff --git a/lib/csharp/src/Protocol/TMessage.cs b/lib/csharp/src/Protocol/TMessage.cs
deleted file mode 100644
index 348263c..0000000
--- a/lib/csharp/src/Protocol/TMessage.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Thrift.Protocol
-{
-    public struct TMessage
-    {
-        private string name;
-        private TMessageType type;
-        private int seqID;
-
-        public TMessage(string name, TMessageType type, int seqid)
-            :this()
-        {
-            this.name = name;
-            this.type = type;
-            this.seqID = seqid;
-        }
-
-        public string Name
-        {
-            get { return name; }
-            set { name = value; }
-        }
-
-        public TMessageType Type
-        {
-            get { return type; }
-            set { type = value; }
-        }
-
-        public int SeqID
-        {
-            get { return seqID; }
-            set { seqID = value; }
-        }
-    }
-}
diff --git a/lib/csharp/src/Protocol/TMessageType.cs b/lib/csharp/src/Protocol/TMessageType.cs
deleted file mode 100644
index c7091fe..0000000
--- a/lib/csharp/src/Protocol/TMessageType.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System;
-
-namespace Thrift.Protocol
-{
-    public enum TMessageType
-    {
-        Call = 1,
-        Reply = 2,
-        Exception = 3,
-        Oneway = 4
-    }
-}
diff --git a/lib/csharp/src/Protocol/TMultiplexedProcessor.cs b/lib/csharp/src/Protocol/TMultiplexedProcessor.cs
deleted file mode 100644
index aa91c52..0000000
--- a/lib/csharp/src/Protocol/TMultiplexedProcessor.cs
+++ /dev/null
@@ -1,183 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Text;
-using Thrift.Transport;
-using System.Collections.Generic;
-using System.IO;
-
-namespace Thrift.Protocol
-{
-    /// <summary>
-    /// <see cref="TMultiplexedProcessor"/> is a <see cref="TProcessor"/> allowing a single <see cref="Thrift.Server.TServer"/>
-    /// to provide multiple services.
-    /// <para/>
-    /// To do so, you instantiate the processor and then register additional processors with it,
-    /// as shown in the following example:
-    /// <para/>
-    /// <code>
-    ///     TMultiplexedProcessor processor = new TMultiplexedProcessor();
-    ///
-    ///     processor.registerProcessor(
-    ///         "Calculator",
-    ///         new Calculator.Processor(new CalculatorHandler()));
-    ///
-    ///     processor.registerProcessor(
-    ///         "WeatherReport",
-    ///         new WeatherReport.Processor(new WeatherReportHandler()));
-    ///
-    ///     TServerTransport t = new TServerSocket(9090);
-    ///     TSimpleServer server = new TSimpleServer(processor, t);
-    ///
-    ///     server.serve();
-    /// </code>
-    /// </summary>
-    public class TMultiplexedProcessor : TProcessor
-    {
-        private Dictionary<string, TProcessor> ServiceProcessorMap = new Dictionary<string, TProcessor>();
-
-        /// <summary>
-        /// 'Register' a service with this TMultiplexedProcessor. This allows us to broker
-        /// requests to individual services by using the service name to select them at request time.
-        ///
-        /// Args:
-        /// - serviceName    Name of a service, has to be identical to the name
-        ///                  declared in the Thrift IDL, e.g. "WeatherReport".
-        /// - processor      Implementation of a service, usually referred to as "handlers",
-        ///                  e.g. WeatherReportHandler implementing WeatherReport.Iface.
-        /// </summary>
-        public void RegisterProcessor(string serviceName, TProcessor processor)
-        {
-            ServiceProcessorMap.Add(serviceName, processor);
-        }
-
-
-        private void Fail(TProtocol oprot, TMessage message, TApplicationException.ExceptionType extype, string etxt)
-        {
-            TApplicationException appex = new TApplicationException(extype, etxt);
-
-            TMessage newMessage = new TMessage(message.Name, TMessageType.Exception, message.SeqID);
-
-            oprot.WriteMessageBegin(newMessage);
-            appex.Write(oprot);
-            oprot.WriteMessageEnd();
-            oprot.Transport.Flush();
-        }
-
-
-        /// <summary>
-        /// This implementation of process performs the following steps:
-        ///
-        /// - Read the beginning of the message.
-        /// - Extract the service name from the message.
-        /// - Using the service name to locate the appropriate processor.
-        /// - Dispatch to the processor, with a decorated instance of TProtocol
-        ///    that allows readMessageBegin() to return the original TMessage.
-        /// <para/>
-        /// Throws an exception if
-        /// - the message type is not CALL or ONEWAY,
-        /// - the service name was not found in the message, or
-        /// - the service name has not been RegisterProcessor()ed.
-        /// </summary>
-        public bool Process(TProtocol iprot, TProtocol oprot)
-        {
-            /*  Use the actual underlying protocol (e.g. TBinaryProtocol) to read the
-                message header.  This pulls the message "off the wire", which we'll
-                deal with at the end of this method. */
-
-            try
-            {
-                TMessage message = iprot.ReadMessageBegin();
-
-                if ((message.Type != TMessageType.Call) && (message.Type != TMessageType.Oneway))
-                {
-                    Fail(oprot, message,
-                          TApplicationException.ExceptionType.InvalidMessageType,
-                          "Message type CALL or ONEWAY expected");
-                    return false;
-                }
-
-                // Extract the service name
-                int index = message.Name.IndexOf(TMultiplexedProtocol.SEPARATOR);
-                if (index < 0)
-                {
-                    Fail(oprot, message,
-                          TApplicationException.ExceptionType.InvalidProtocol,
-                          "Service name not found in message name: " + message.Name + ". " +
-                          "Did you forget to use a TMultiplexProtocol in your client?");
-                    return false;
-                }
-
-                // Create a new TMessage, something that can be consumed by any TProtocol
-                string serviceName = message.Name.Substring(0, index);
-                TProcessor actualProcessor;
-                if (!ServiceProcessorMap.TryGetValue(serviceName, out actualProcessor))
-                {
-                    Fail(oprot, message,
-                          TApplicationException.ExceptionType.InternalError,
-                          "Service name not found: " + serviceName + ". " +
-                          "Did you forget to call RegisterProcessor()?");
-                    return false;
-                }
-
-                // Create a new TMessage, removing the service name
-                TMessage newMessage = new TMessage(
-                        message.Name.Substring(serviceName.Length + TMultiplexedProtocol.SEPARATOR.Length),
-                        message.Type,
-                        message.SeqID);
-
-                // Dispatch processing to the stored processor
-                return actualProcessor.Process(new StoredMessageProtocol(iprot, newMessage), oprot);
-
-            }
-            catch (IOException)
-            {
-                return false;  // similar to all other processors
-            }
-
-        }
-
-        /// <summary>
-        ///  Our goal was to work with any protocol.  In order to do that, we needed
-        ///  to allow them to call readMessageBegin() and get a TMessage in exactly
-        ///  the standard format, without the service name prepended to TMessage.name.
-        /// </summary>
-        private class StoredMessageProtocol : TProtocolDecorator
-        {
-            TMessage MsgBegin;
-
-            public StoredMessageProtocol(TProtocol protocol, TMessage messageBegin)
-                : base(protocol)
-            {
-                this.MsgBegin = messageBegin;
-            }
-
-            public override TMessage ReadMessageBegin()
-            {
-                return MsgBegin;
-            }
-        }
-
-    }
-}
diff --git a/lib/csharp/src/Protocol/TMultiplexedProtocol.cs b/lib/csharp/src/Protocol/TMultiplexedProtocol.cs
deleted file mode 100644
index 1bd420f..0000000
--- a/lib/csharp/src/Protocol/TMultiplexedProtocol.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Text;
-using Thrift.Transport;
-using System.Collections.Generic;
-
-namespace Thrift.Protocol
-{
-
-    /// <summary>
-    /// TMultiplexedProtocol is a protocol-independent concrete decorator that allows a Thrift
-    /// client to communicate with a multiplexing Thrift server, by prepending the service name
-    /// to the function name during function calls.
-    /// <para/>
-    /// NOTE: THIS IS NOT TO BE USED BY SERVERS.
-    /// On the server, use TMultiplexedProcessor to handle requests from a multiplexing client.
-    /// <para/>
-    /// This example uses a single socket transport to invoke two services:
-    /// <code>
-    ///     TSocket transport = new TSocket("localhost", 9090);
-    ///     transport.open();
-    ///
-    ///     TBinaryProtocol protocol = new TBinaryProtocol(transport);
-    ///
-    ///     TMultiplexedProtocol mp = new TMultiplexedProtocol(protocol, "Calculator");
-    ///     Calculator.Client service = new Calculator.Client(mp);
-    ///
-    ///     TMultiplexedProtocol mp2 = new TMultiplexedProtocol(protocol, "WeatherReport");
-    ///     WeatherReport.Client service2 = new WeatherReport.Client(mp2);
-    ///
-    ///     System.out.println(service.add(2,2));
-    ///     System.out.println(service2.getTemperature());
-    /// </code>
-    /// </summary>
-    public class TMultiplexedProtocol : TProtocolDecorator
-    {
-
-        /// <summary>
-        /// Used to delimit the service name from the function name.
-        /// </summary>
-        public static string SEPARATOR = ":";
-
-        private string ServiceName;
-
-        /// <summary>
-        /// Wrap the specified protocol, allowing it to be used to communicate with a
-        /// multiplexing server.  The <paramref name="serviceName"/> is required as it is
-        /// prepended to the message header so that the multiplexing server can broker
-        /// the function call to the proper service.
-        /// </summary>
-        /// <param name="protocol">Your communication protocol of choice, e.g. <see cref="TBinaryProtocol"/>.</param>
-        /// <param name="serviceName">The service name of the service communicating via this protocol.</param>
-        public TMultiplexedProtocol(TProtocol protocol, string serviceName)
-            : base(protocol)
-        {
-            ServiceName = serviceName;
-        }
-
-        /// <summary>
-        /// Prepends the service name to the function name, separated by TMultiplexedProtocol.SEPARATOR.
-        /// </summary>
-        /// <param name="tMessage">The original message.</param>
-        public override void WriteMessageBegin(TMessage tMessage)
-        {
-            switch (tMessage.Type)
-            {
-                case TMessageType.Call:
-                case TMessageType.Oneway:
-                    base.WriteMessageBegin(new TMessage(
-                        ServiceName + SEPARATOR + tMessage.Name,
-                        tMessage.Type,
-                        tMessage.SeqID));
-                    break;
-
-                default:
-                    base.WriteMessageBegin(tMessage);
-                    break;
-            }
-        }
-    }
-}
diff --git a/lib/csharp/src/Protocol/TProtocol.cs b/lib/csharp/src/Protocol/TProtocol.cs
deleted file mode 100644
index dd7a6e0..0000000
--- a/lib/csharp/src/Protocol/TProtocol.cs
+++ /dev/null
@@ -1,142 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Text;
-using Thrift.Transport;
-
-namespace Thrift.Protocol
-{
-    public abstract class TProtocol : IDisposable
-    {
-        private const int DEFAULT_RECURSION_DEPTH = 64;
-
-        protected TTransport trans;
-        protected int recursionLimit;
-        protected int recursionDepth;
-
-        protected TProtocol(TTransport trans)
-        {
-            this.trans = trans;
-            this.recursionLimit = DEFAULT_RECURSION_DEPTH;
-            this.recursionDepth = 0;
-        }
-
-        public TTransport Transport
-        {
-            get { return trans; }
-        }
-
-        public int RecursionLimit
-        {
-            get { return recursionLimit; }
-            set { recursionLimit = value; }
-        }
-
-        public void IncrementRecursionDepth()
-        {
-            if (recursionDepth < recursionLimit)
-                ++recursionDepth;
-            else
-                throw new TProtocolException(TProtocolException.DEPTH_LIMIT, "Depth limit exceeded");
-        }
-
-        public void DecrementRecursionDepth()
-        {
-            --recursionDepth;
-        }
-
-        #region " IDisposable Support "
-        private bool _IsDisposed;
-
-        // IDisposable
-        public void Dispose()
-        {
-            Dispose(true);
-        }
-
-        protected virtual void Dispose(bool disposing)
-        {
-            if (!_IsDisposed)
-            {
-                if (disposing)
-                {
-                    if (trans is IDisposable)
-                        (trans as IDisposable).Dispose();
-                }
-            }
-            _IsDisposed = true;
-        }
-        #endregion
-
-        public abstract void WriteMessageBegin(TMessage message);
-        public abstract void WriteMessageEnd();
-        public abstract void WriteStructBegin(TStruct struc);
-        public abstract void WriteStructEnd();
-        public abstract void WriteFieldBegin(TField field);
-        public abstract void WriteFieldEnd();
-        public abstract void WriteFieldStop();
-        public abstract void WriteMapBegin(TMap map);
-        public abstract void WriteMapEnd();
-        public abstract void WriteListBegin(TList list);
-        public abstract void WriteListEnd();
-        public abstract void WriteSetBegin(TSet set);
-        public abstract void WriteSetEnd();
-        public abstract void WriteBool(bool b);
-        public abstract void WriteByte(sbyte b);
-        public abstract void WriteI16(short i16);
-        public abstract void WriteI32(int i32);
-        public abstract void WriteI64(long i64);
-        public abstract void WriteDouble(double d);
-        public virtual void WriteString(string s)
-        {
-            WriteBinary(Encoding.UTF8.GetBytes(s));
-        }
-        public abstract void WriteBinary(byte[] b);
-
-        public abstract TMessage ReadMessageBegin();
-        public abstract void ReadMessageEnd();
-        public abstract TStruct ReadStructBegin();
-        public abstract void ReadStructEnd();
-        public abstract TField ReadFieldBegin();
-        public abstract void ReadFieldEnd();
-        public abstract TMap ReadMapBegin();
-        public abstract void ReadMapEnd();
-        public abstract TList ReadListBegin();
-        public abstract void ReadListEnd();
-        public abstract TSet ReadSetBegin();
-        public abstract void ReadSetEnd();
-        public abstract bool ReadBool();
-        public abstract sbyte ReadByte();
-        public abstract short ReadI16();
-        public abstract int ReadI32();
-        public abstract long ReadI64();
-        public abstract double ReadDouble();
-        public virtual string ReadString()
-        {
-            var buf = ReadBinary();
-            return Encoding.UTF8.GetString(buf, 0, buf.Length);
-        }
-        public abstract byte[] ReadBinary();
-    }
-}
diff --git a/lib/csharp/src/Protocol/TProtocolDecorator.cs b/lib/csharp/src/Protocol/TProtocolDecorator.cs
deleted file mode 100644
index 8600002..0000000
--- a/lib/csharp/src/Protocol/TProtocolDecorator.cs
+++ /dev/null
@@ -1,261 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Text;
-using Thrift.Transport;
-using System.Collections.Generic;
-
-namespace Thrift.Protocol
-{
-    /// <summary>
-    /// <see cref="TProtocolDecorator"/> forwards all requests to an enclosed <see cref="TProtocol"/> instance,
-    /// providing a way to author concise concrete decorator subclasses. While it has
-    /// no abstract methods, it is marked abstract as a reminder that by itself,
-    /// it does not modify the behaviour of the enclosed <see cref="TProtocol"/>.
-    /// <para/>
-    /// See p.175 of Design Patterns (by Gamma et al.)
-    /// </summary>
-    /// <seealso cref="TMultiplexedProtocol"/>
-    public abstract class TProtocolDecorator : TProtocol
-    {
-        private TProtocol WrappedProtocol;
-
-        /// <summary>
-        /// Encloses the specified protocol.
-        /// </summary>
-        /// <param name="protocol">All operations will be forward to this protocol.  Must be non-null.</param>
-        public TProtocolDecorator(TProtocol protocol)
-            : base(protocol.Transport)
-        {
-
-            WrappedProtocol = protocol;
-        }
-
-        public override void WriteMessageBegin(TMessage tMessage)
-        {
-            WrappedProtocol.WriteMessageBegin(tMessage);
-        }
-
-        public override void WriteMessageEnd()
-        {
-            WrappedProtocol.WriteMessageEnd();
-        }
-
-        public override void WriteStructBegin(TStruct tStruct)
-        {
-            WrappedProtocol.WriteStructBegin(tStruct);
-        }
-
-        public override void WriteStructEnd()
-        {
-            WrappedProtocol.WriteStructEnd();
-        }
-
-        public override void WriteFieldBegin(TField tField)
-        {
-            WrappedProtocol.WriteFieldBegin(tField);
-        }
-
-        public override void WriteFieldEnd()
-        {
-            WrappedProtocol.WriteFieldEnd();
-        }
-
-        public override void WriteFieldStop()
-        {
-            WrappedProtocol.WriteFieldStop();
-        }
-
-        public override void WriteMapBegin(TMap tMap)
-        {
-            WrappedProtocol.WriteMapBegin(tMap);
-        }
-
-        public override void WriteMapEnd()
-        {
-            WrappedProtocol.WriteMapEnd();
-        }
-
-        public override void WriteListBegin(TList tList)
-        {
-            WrappedProtocol.WriteListBegin(tList);
-        }
-
-        public override void WriteListEnd()
-        {
-            WrappedProtocol.WriteListEnd();
-        }
-
-        public override void WriteSetBegin(TSet tSet)
-        {
-            WrappedProtocol.WriteSetBegin(tSet);
-        }
-
-        public override void WriteSetEnd()
-        {
-            WrappedProtocol.WriteSetEnd();
-        }
-
-        public override void WriteBool(bool b)
-        {
-            WrappedProtocol.WriteBool(b);
-        }
-
-        public override void WriteByte(sbyte b)
-        {
-            WrappedProtocol.WriteByte(b);
-        }
-
-        public override void WriteI16(short i)
-        {
-            WrappedProtocol.WriteI16(i);
-        }
-
-        public override void WriteI32(int i)
-        {
-            WrappedProtocol.WriteI32(i);
-        }
-
-        public override void WriteI64(long l)
-        {
-            WrappedProtocol.WriteI64(l);
-        }
-
-        public override void WriteDouble(double v)
-        {
-            WrappedProtocol.WriteDouble(v);
-        }
-
-        public override void WriteString(string s)
-        {
-            WrappedProtocol.WriteString(s);
-        }
-
-        public override void WriteBinary(byte[] bytes)
-        {
-            WrappedProtocol.WriteBinary(bytes);
-        }
-
-        public override TMessage ReadMessageBegin()
-        {
-            return WrappedProtocol.ReadMessageBegin();
-        }
-
-        public override void ReadMessageEnd()
-        {
-            WrappedProtocol.ReadMessageEnd();
-        }
-
-        public override TStruct ReadStructBegin()
-        {
-            return WrappedProtocol.ReadStructBegin();
-        }
-
-        public override void ReadStructEnd()
-        {
-            WrappedProtocol.ReadStructEnd();
-        }
-
-        public override TField ReadFieldBegin()
-        {
-            return WrappedProtocol.ReadFieldBegin();
-        }
-
-        public override void ReadFieldEnd()
-        {
-            WrappedProtocol.ReadFieldEnd();
-        }
-
-        public override TMap ReadMapBegin()
-        {
-            return WrappedProtocol.ReadMapBegin();
-        }
-
-        public override void ReadMapEnd()
-        {
-            WrappedProtocol.ReadMapEnd();
-        }
-
-        public override TList ReadListBegin()
-        {
-            return WrappedProtocol.ReadListBegin();
-        }
-
-        public override void ReadListEnd()
-        {
-            WrappedProtocol.ReadListEnd();
-        }
-
-        public override TSet ReadSetBegin()
-        {
-            return WrappedProtocol.ReadSetBegin();
-        }
-
-        public override void ReadSetEnd()
-        {
-            WrappedProtocol.ReadSetEnd();
-        }
-
-        public override bool ReadBool()
-        {
-            return WrappedProtocol.ReadBool();
-        }
-
-        public override sbyte ReadByte()
-        {
-            return WrappedProtocol.ReadByte();
-        }
-
-        public override short ReadI16()
-        {
-            return WrappedProtocol.ReadI16();
-        }
-
-        public override int ReadI32()
-        {
-            return WrappedProtocol.ReadI32();
-        }
-
-        public override long ReadI64()
-        {
-            return WrappedProtocol.ReadI64();
-        }
-
-        public override double ReadDouble()
-        {
-            return WrappedProtocol.ReadDouble();
-        }
-
-        public override string ReadString()
-        {
-            return WrappedProtocol.ReadString();
-        }
-
-        public override byte[] ReadBinary()
-        {
-            return WrappedProtocol.ReadBinary();
-        }
-    }
-
-}
diff --git a/lib/csharp/src/Protocol/TProtocolException.cs b/lib/csharp/src/Protocol/TProtocolException.cs
deleted file mode 100644
index 7bef236..0000000
--- a/lib/csharp/src/Protocol/TProtocolException.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-
-namespace Thrift.Protocol
-{
-    public class TProtocolException : TException
-    {
-        public const int UNKNOWN = 0;
-        public const int INVALID_DATA = 1;
-        public const int NEGATIVE_SIZE = 2;
-        public const int SIZE_LIMIT = 3;
-        public const int BAD_VERSION = 4;
-        public const int NOT_IMPLEMENTED = 5;
-        public const int DEPTH_LIMIT = 6;
-
-        protected int type_ = UNKNOWN;
-
-        public TProtocolException()
-            : base()
-        {
-        }
-
-        public TProtocolException(int type, Exception inner = null)
-            : base(string.Empty, inner)
-        {
-            type_ = type;
-        }
-
-        public TProtocolException(int type, string message, Exception inner = null)
-            : base(message, inner)
-        {
-            type_ = type;
-        }
-
-        public TProtocolException(string message, Exception inner = null)
-            : base(message, inner)
-        {
-        }
-
-        public int getType()
-        {
-            return type_;
-        }
-    }
-}
diff --git a/lib/csharp/src/Protocol/TProtocolFactory.cs b/lib/csharp/src/Protocol/TProtocolFactory.cs
deleted file mode 100644
index 71360a1..0000000
--- a/lib/csharp/src/Protocol/TProtocolFactory.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using Thrift.Transport;
-
-namespace Thrift.Protocol
-{
-    public interface TProtocolFactory
-    {
-        TProtocol GetProtocol(TTransport trans);
-    }
-}
diff --git a/lib/csharp/src/Protocol/TProtocolUtil.cs b/lib/csharp/src/Protocol/TProtocolUtil.cs
deleted file mode 100644
index d995c6c..0000000
--- a/lib/csharp/src/Protocol/TProtocolUtil.cs
+++ /dev/null
@@ -1,108 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-
-namespace Thrift.Protocol
-{
-    public static class TProtocolUtil
-    {
-        public static void Skip(TProtocol prot, TType type)
-        {
-            prot.IncrementRecursionDepth();
-            try
-            {
-                switch (type)
-                {
-                    case TType.Bool:
-                        prot.ReadBool();
-                        break;
-                    case TType.Byte:
-                        prot.ReadByte();
-                        break;
-                    case TType.I16:
-                        prot.ReadI16();
-                        break;
-                    case TType.I32:
-                        prot.ReadI32();
-                        break;
-                    case TType.I64:
-                        prot.ReadI64();
-                        break;
-                    case TType.Double:
-                        prot.ReadDouble();
-                        break;
-                    case TType.String:
-                        // Don't try to decode the string, just skip it.
-                        prot.ReadBinary();
-                        break;
-                    case TType.Struct:
-                        prot.ReadStructBegin();
-                        while (true)
-                        {
-                            TField field = prot.ReadFieldBegin();
-                            if (field.Type == TType.Stop)
-                            {
-                                break;
-                            }
-                            Skip(prot, field.Type);
-                            prot.ReadFieldEnd();
-                        }
-                        prot.ReadStructEnd();
-                        break;
-                    case TType.Map:
-                        TMap map = prot.ReadMapBegin();
-                        for (int i = 0; i < map.Count; i++)
-                        {
-                            Skip(prot, map.KeyType);
-                            Skip(prot, map.ValueType);
-                        }
-                        prot.ReadMapEnd();
-                        break;
-                    case TType.Set:
-                        TSet set = prot.ReadSetBegin();
-                        for (int i = 0; i < set.Count; i++)
-                        {
-                            Skip(prot, set.ElementType);
-                        }
-                        prot.ReadSetEnd();
-                        break;
-                    case TType.List:
-                        TList list = prot.ReadListBegin();
-                        for (int i = 0; i < list.Count; i++)
-                        {
-                            Skip(prot, list.ElementType);
-                        }
-                        prot.ReadListEnd();
-                        break;
-                    default:
-                        throw new TProtocolException(TProtocolException.INVALID_DATA, "Unknown data type " + type.ToString("d"));
-                }
-            }
-            finally
-            {
-                prot.DecrementRecursionDepth();
-            }
-        }
-    }
-}
diff --git a/lib/csharp/src/Protocol/TSet.cs b/lib/csharp/src/Protocol/TSet.cs
deleted file mode 100644
index a918ab5..0000000
--- a/lib/csharp/src/Protocol/TSet.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Thrift.Protocol
-{
-    public struct TSet
-    {
-        private TType elementType;
-        private int count;
-
-        public TSet(TType elementType, int count)
-            :this()
-        {
-            this.elementType = elementType;
-            this.count = count;
-        }
-
-        public TSet(TList list)
-            : this(list.ElementType, list.Count)
-        {
-        }
-
-        public TType ElementType
-        {
-            get { return elementType; }
-            set { elementType = value; }
-        }
-
-        public int Count
-        {
-            get { return count; }
-            set { count = value; }
-        }
-    }
-}
diff --git a/lib/csharp/src/Protocol/TStruct.cs b/lib/csharp/src/Protocol/TStruct.cs
deleted file mode 100644
index f4844a4..0000000
--- a/lib/csharp/src/Protocol/TStruct.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Thrift.Protocol
-{
-    public struct TStruct
-    {
-        private string name;
-
-        public TStruct(string name)
-            :this()
-        {
-            this.name = name;
-        }
-
-        public string Name
-        {
-            get { return name; }
-            set { name = value; }
-        }
-    }
-}
diff --git a/lib/csharp/src/Protocol/TType.cs b/lib/csharp/src/Protocol/TType.cs
deleted file mode 100644
index 9ce915e..0000000
--- a/lib/csharp/src/Protocol/TType.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-
-namespace Thrift.Protocol
-{
-    public enum TType : byte
-    {
-        Stop = 0,
-        Void = 1,
-        Bool = 2,
-        Byte = 3,
-        Double = 4,
-        I16 = 6,
-        I32 = 8,
-        I64 = 10,
-        String = 11,
-        Struct = 12,
-        Map = 13,
-        Set = 14,
-        List = 15
-    }
-}
diff --git a/lib/csharp/src/Server/TServer.cs b/lib/csharp/src/Server/TServer.cs
deleted file mode 100644
index 2bc04f3..0000000
--- a/lib/csharp/src/Server/TServer.cs
+++ /dev/null
@@ -1,155 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using Thrift.Protocol;
-using Thrift.Transport;
-using System.IO;
-
-namespace Thrift.Server
-{
-    public abstract class TServer
-    {
-        //Attributes
-        protected TProcessorFactory processorFactory;
-        protected TServerTransport serverTransport;
-        protected TTransportFactory inputTransportFactory;
-        protected TTransportFactory outputTransportFactory;
-        protected TProtocolFactory inputProtocolFactory;
-        protected TProtocolFactory outputProtocolFactory;
-        protected TServerEventHandler serverEventHandler = null;
-
-        //Methods
-        public void setEventHandler(TServerEventHandler seh)
-        {
-            serverEventHandler = seh;
-        }
-        public TServerEventHandler getEventHandler()
-        {
-            return serverEventHandler;
-        }
-
-        //Log delegation
-        public delegate void LogDelegate(string str);
-        private LogDelegate _logDelegate;
-        protected LogDelegate logDelegate
-        {
-            get { return _logDelegate; }
-            set { _logDelegate = (value != null) ? value : DefaultLogDelegate; }
-        }
-        protected static void DefaultLogDelegate(string s)
-        {
-            Console.Error.WriteLine(s);
-        }
-
-        //Construction
-        public TServer(TProcessor processor,
-                  TServerTransport serverTransport)
-          : this(processor, serverTransport,
-             new TTransportFactory(),
-             new TTransportFactory(),
-             new TBinaryProtocol.Factory(),
-             new TBinaryProtocol.Factory(),
-             DefaultLogDelegate)
-        {
-        }
-
-        public TServer(TProcessor processor,
-                TServerTransport serverTransport,
-                LogDelegate logDelegate)
-          : this(processor,
-             serverTransport,
-             new TTransportFactory(),
-             new TTransportFactory(),
-             new TBinaryProtocol.Factory(),
-             new TBinaryProtocol.Factory(),
-             logDelegate)
-        {
-        }
-
-        public TServer(TProcessor processor,
-                  TServerTransport serverTransport,
-                  TTransportFactory transportFactory)
-          : this(processor,
-             serverTransport,
-             transportFactory,
-             transportFactory,
-             new TBinaryProtocol.Factory(),
-             new TBinaryProtocol.Factory(),
-             DefaultLogDelegate)
-        {
-        }
-
-        public TServer(TProcessor processor,
-                  TServerTransport serverTransport,
-                  TTransportFactory transportFactory,
-                  TProtocolFactory protocolFactory)
-          : this(processor,
-             serverTransport,
-             transportFactory,
-             transportFactory,
-             protocolFactory,
-             protocolFactory,
-               DefaultLogDelegate)
-        {
-        }
-
-        public TServer(TProcessor processor,
-            TServerTransport serverTransport,
-            TTransportFactory inputTransportFactory,
-            TTransportFactory outputTransportFactory,
-            TProtocolFactory inputProtocolFactory,
-            TProtocolFactory outputProtocolFactory,
-            LogDelegate logDelegate)
-        {
-            this.processorFactory = new TSingletonProcessorFactory(processor);
-            this.serverTransport = serverTransport;
-            this.inputTransportFactory = inputTransportFactory;
-            this.outputTransportFactory = outputTransportFactory;
-            this.inputProtocolFactory = inputProtocolFactory;
-            this.outputProtocolFactory = outputProtocolFactory;
-            this.logDelegate = (logDelegate != null) ? logDelegate : DefaultLogDelegate;
-        }
-
-        public TServer(TProcessorFactory processorFactory,
-                  TServerTransport serverTransport,
-                  TTransportFactory inputTransportFactory,
-                  TTransportFactory outputTransportFactory,
-                  TProtocolFactory inputProtocolFactory,
-                  TProtocolFactory outputProtocolFactory,
-                  LogDelegate logDelegate)
-        {
-            this.processorFactory = processorFactory;
-            this.serverTransport = serverTransport;
-            this.inputTransportFactory = inputTransportFactory;
-            this.outputTransportFactory = outputTransportFactory;
-            this.inputProtocolFactory = inputProtocolFactory;
-            this.outputProtocolFactory = outputProtocolFactory;
-            this.logDelegate = (logDelegate != null) ? logDelegate : DefaultLogDelegate;
-        }
-
-        //Abstract Interface
-        public abstract void Serve();
-        public abstract void Stop();
-    }
-}
diff --git a/lib/csharp/src/Server/TServerEventHandler.cs b/lib/csharp/src/Server/TServerEventHandler.cs
deleted file mode 100644
index e81efc6..0000000
--- a/lib/csharp/src/Server/TServerEventHandler.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-
-namespace Thrift.Server
-{
-    /// <summary>
-    /// Interface implemented by server users to handle events from the server.
-    /// </summary>
-    public interface TServerEventHandler
-    {
-        /// <summary>
-        /// Called before the server begins.
-        /// </summary>
-        void preServe();
-
-        /// <summary>
-        /// Called when a new client has connected and is about to being processing.
-        /// </summary>
-        object createContext(Thrift.Protocol.TProtocol input, Thrift.Protocol.TProtocol output);
-
-        /// <summary>
-        /// Called when a client has finished request-handling to delete server context.
-        /// </summary>
-        void deleteContext(object serverContext, Thrift.Protocol.TProtocol input, Thrift.Protocol.TProtocol output);
-
-        /// <summary>
-        /// Called when a client is about to call the processor.
-        /// </summary>
-        void processContext(object serverContext, Thrift.Transport.TTransport transport);
-    };
-}
diff --git a/lib/csharp/src/Server/TSimpleServer.cs b/lib/csharp/src/Server/TSimpleServer.cs
deleted file mode 100644
index 4e7ea96..0000000
--- a/lib/csharp/src/Server/TSimpleServer.cs
+++ /dev/null
@@ -1,180 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using Thrift.Transport;
-using Thrift.Protocol;
-
-namespace Thrift.Server
-{
-    /// <summary>
-    /// Simple single-threaded server for testing.
-    /// </summary>
-    public class TSimpleServer : TServer
-    {
-        private bool stop = false;
-
-        public TSimpleServer(TProcessor processor,
-                  TServerTransport serverTransport)
-          : base(processor, serverTransport, new TTransportFactory(), new TTransportFactory(), new TBinaryProtocol.Factory(), new TBinaryProtocol.Factory(), DefaultLogDelegate)
-        {
-        }
-
-        public TSimpleServer(TProcessor processor,
-                  TServerTransport serverTransport,
-                  LogDelegate logDel)
-          : base(processor, serverTransport, new TTransportFactory(), new TTransportFactory(), new TBinaryProtocol.Factory(), new TBinaryProtocol.Factory(), logDel)
-        {
-        }
-
-        public TSimpleServer(TProcessor processor,
-                  TServerTransport serverTransport,
-                  TTransportFactory transportFactory)
-          : base(processor,
-             serverTransport,
-             transportFactory,
-             transportFactory,
-             new TBinaryProtocol.Factory(),
-             new TBinaryProtocol.Factory(),
-               DefaultLogDelegate)
-        {
-        }
-
-        public TSimpleServer(TProcessor processor,
-            TServerTransport serverTransport,
-            TTransportFactory transportFactory,
-            TProtocolFactory protocolFactory)
-            : base(processor,
-               serverTransport,
-               transportFactory,
-               transportFactory,
-               protocolFactory,
-               protocolFactory,
-               DefaultLogDelegate)
-        {
-        }
-
-        public TSimpleServer(TProcessorFactory processorFactory,
-                  TServerTransport serverTransport,
-                  TTransportFactory transportFactory,
-                  TProtocolFactory protocolFactory)
-          : base(processorFactory,
-             serverTransport,
-             transportFactory,
-             transportFactory,
-             protocolFactory,
-             protocolFactory,
-             DefaultLogDelegate)
-        {
-        }
-
-        public override void Serve()
-        {
-            try
-            {
-                serverTransport.Listen();
-            }
-            catch (TTransportException ttx)
-            {
-                logDelegate(ttx.ToString());
-                return;
-            }
-
-            //Fire the preServe server event when server is up but before any client connections
-            if (serverEventHandler != null)
-                serverEventHandler.preServe();
-
-            while (!stop)
-            {
-                TProcessor processor = null;
-                TTransport client = null;
-                TTransport inputTransport = null;
-                TTransport outputTransport = null;
-                TProtocol inputProtocol = null;
-                TProtocol outputProtocol = null;
-                object connectionContext = null;
-                try
-                {
-                    using (client = serverTransport.Accept())
-                    {
-                        processor = processorFactory.GetProcessor(client);
-                        if (client != null)
-                        {
-                            using (inputTransport = inputTransportFactory.GetTransport(client))
-                            {
-                                using (outputTransport = outputTransportFactory.GetTransport(client))
-                                {
-                                    inputProtocol = inputProtocolFactory.GetProtocol(inputTransport);
-                                    outputProtocol = outputProtocolFactory.GetProtocol(outputTransport);
-
-                                    //Recover event handler (if any) and fire createContext server event when a client connects
-                                    if (serverEventHandler != null)
-                                        connectionContext = serverEventHandler.createContext(inputProtocol, outputProtocol);
-
-                                    //Process client requests until client disconnects
-                                    while (!stop)
-                                    {
-                                        if (!inputTransport.Peek())
-                                            break;
-
-                                        //Fire processContext server event
-                                        //N.B. This is the pattern implemented in C++ and the event fires provisionally.
-                                        //That is to say it may be many minutes between the event firing and the client request
-                                        //actually arriving or the client may hang up without ever makeing a request.
-                                        if (serverEventHandler != null)
-                                            serverEventHandler.processContext(connectionContext, inputTransport);
-                                        //Process client request (blocks until transport is readable)
-                                        if (!processor.Process(inputProtocol, outputProtocol))
-                                            break;
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-                catch (TTransportException ttx)
-                {
-                    if (!stop || ttx.Type != TTransportException.ExceptionType.Interrupted)
-                    {
-                        logDelegate(ttx.ToString());
-                    }
-                }
-                catch (Exception x)
-                {
-                    //Unexpected
-                    logDelegate(x.ToString());
-                }
-
-                //Fire deleteContext server event after client disconnects
-                if (serverEventHandler != null)
-                    serverEventHandler.deleteContext(connectionContext, inputProtocol, outputProtocol);
-            }
-        }
-
-        public override void Stop()
-        {
-            stop = true;
-            serverTransport.Close();
-        }
-    }
-}
diff --git a/lib/csharp/src/Server/TThreadPoolServer.cs b/lib/csharp/src/Server/TThreadPoolServer.cs
deleted file mode 100644
index a494ce7..0000000
--- a/lib/csharp/src/Server/TThreadPoolServer.cs
+++ /dev/null
@@ -1,295 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Threading;
-using Thrift.Protocol;
-using Thrift.Transport;
-
-namespace Thrift.Server
-{
-    /// <summary>
-    /// Server that uses C# built-in ThreadPool to spawn threads when handling requests.
-    /// </summary>
-    public class TThreadPoolServer : TServer
-    {
-        private const int DEFAULT_MIN_THREADS = -1;  // use .NET ThreadPool defaults
-        private const int DEFAULT_MAX_THREADS = -1;  // use .NET ThreadPool defaults
-        private volatile bool stop = false;
-
-        public struct Configuration
-        {
-            public int MinWorkerThreads;
-            public int MaxWorkerThreads;
-            public int MinIOThreads;
-            public int MaxIOThreads;
-
-            public Configuration(int min = DEFAULT_MIN_THREADS, int max = DEFAULT_MAX_THREADS)
-            {
-                MinWorkerThreads = min;
-                MaxWorkerThreads = max;
-                MinIOThreads = min;
-                MaxIOThreads = max;
-            }
-
-            public Configuration(int minWork, int maxWork, int minIO, int maxIO)
-            {
-                MinWorkerThreads = minWork;
-                MaxWorkerThreads = maxWork;
-                MinIOThreads = minIO;
-                MaxIOThreads = maxIO;
-            }
-        }
-
-        public TThreadPoolServer(TProcessor processor, TServerTransport serverTransport)
-            : this(new TSingletonProcessorFactory(processor), serverTransport,
-             new TTransportFactory(), new TTransportFactory(),
-             new TBinaryProtocol.Factory(), new TBinaryProtocol.Factory(),
-             new Configuration(), DefaultLogDelegate)
-        {
-        }
-
-        public TThreadPoolServer(TProcessor processor, TServerTransport serverTransport, LogDelegate logDelegate)
-            : this(new TSingletonProcessorFactory(processor), serverTransport,
-             new TTransportFactory(), new TTransportFactory(),
-             new TBinaryProtocol.Factory(), new TBinaryProtocol.Factory(),
-             new Configuration(), logDelegate)
-        {
-        }
-
-        public TThreadPoolServer(TProcessor processor,
-         TServerTransport serverTransport,
-         TTransportFactory transportFactory,
-         TProtocolFactory protocolFactory)
-            : this(new TSingletonProcessorFactory(processor), serverTransport,
-               transportFactory, transportFactory,
-               protocolFactory, protocolFactory,
-               new Configuration(), DefaultLogDelegate)
-        {
-        }
-
-        public TThreadPoolServer(TProcessorFactory processorFactory,
-                     TServerTransport serverTransport,
-                     TTransportFactory transportFactory,
-                     TProtocolFactory protocolFactory)
-            : this(processorFactory, serverTransport,
-             transportFactory, transportFactory,
-             protocolFactory, protocolFactory,
-             new Configuration(), DefaultLogDelegate)
-        {
-        }
-
-        public TThreadPoolServer(TProcessorFactory processorFactory,
-                     TServerTransport serverTransport,
-                     TTransportFactory inputTransportFactory,
-                     TTransportFactory outputTransportFactory,
-                     TProtocolFactory inputProtocolFactory,
-                     TProtocolFactory outputProtocolFactory,
-                     int minThreadPoolThreads, int maxThreadPoolThreads, LogDelegate logDel)
-            : this(processorFactory, serverTransport, inputTransportFactory, outputTransportFactory,
-             inputProtocolFactory, outputProtocolFactory,
-             new Configuration(minThreadPoolThreads, maxThreadPoolThreads),
-             logDel)
-        {
-        }
-
-        public TThreadPoolServer(TProcessorFactory processorFactory,
-                     TServerTransport serverTransport,
-                     TTransportFactory inputTransportFactory,
-                     TTransportFactory outputTransportFactory,
-                     TProtocolFactory inputProtocolFactory,
-                     TProtocolFactory outputProtocolFactory,
-                     Configuration threadConfig,
-                     LogDelegate logDel)
-            : base(processorFactory, serverTransport, inputTransportFactory, outputTransportFactory,
-            inputProtocolFactory, outputProtocolFactory, logDel)
-        {
-            lock (typeof(TThreadPoolServer))
-            {
-                if ((threadConfig.MaxWorkerThreads > 0) || (threadConfig.MaxIOThreads > 0))
-                {
-                    int work, comm;
-                    ThreadPool.GetMaxThreads(out work, out comm);
-                    if (threadConfig.MaxWorkerThreads > 0)
-                        work = threadConfig.MaxWorkerThreads;
-                    if (threadConfig.MaxIOThreads > 0)
-                        comm = threadConfig.MaxIOThreads;
-                    if (!ThreadPool.SetMaxThreads(work, comm))
-                        throw new Exception("Error: could not SetMaxThreads in ThreadPool");
-                }
-
-                if ((threadConfig.MinWorkerThreads > 0) || (threadConfig.MinIOThreads > 0))
-                {
-                    int work, comm;
-                    ThreadPool.GetMinThreads(out work, out comm);
-                    if (threadConfig.MinWorkerThreads > 0)
-                        work = threadConfig.MinWorkerThreads;
-                    if (threadConfig.MinIOThreads > 0)
-                        comm = threadConfig.MinIOThreads;
-                    if (!ThreadPool.SetMinThreads(work, comm))
-                        throw new Exception("Error: could not SetMinThreads in ThreadPool");
-                }
-            }
-        }
-
-
-        /// <summary>
-        /// Use new ThreadPool thread for each new client connection.
-        /// </summary>
-        public override void Serve()
-        {
-            try
-            {
-                serverTransport.Listen();
-            }
-            catch (TTransportException ttx)
-            {
-                logDelegate("Error, could not listen on ServerTransport: " + ttx);
-                return;
-            }
-
-            //Fire the preServe server event when server is up but before any client connections
-            if (serverEventHandler != null)
-                serverEventHandler.preServe();
-
-            while (!stop)
-            {
-                int failureCount = 0;
-                try
-                {
-                    TTransport client = serverTransport.Accept();
-                    ThreadPool.QueueUserWorkItem(this.Execute, client);
-                }
-                catch (TTransportException ttx)
-                {
-                    if (!stop || ttx.Type != TTransportException.ExceptionType.Interrupted)
-                    {
-                        ++failureCount;
-                        logDelegate(ttx.ToString());
-                    }
-
-                }
-            }
-
-            if (stop)
-            {
-                try
-                {
-                    serverTransport.Close();
-                }
-                catch (TTransportException ttx)
-                {
-                    logDelegate("TServerTransport failed on close: " + ttx.Message);
-                }
-                stop = false;
-            }
-        }
-
-        /// <summary>
-        /// Loops on processing a client forever
-        /// threadContext will be a TTransport instance
-        /// </summary>
-        /// <param name="threadContext"></param>
-        private void Execute(object threadContext)
-        {
-            using (TTransport client = (TTransport)threadContext)
-            {
-                TProcessor processor = processorFactory.GetProcessor(client, this);
-                TTransport inputTransport = null;
-                TTransport outputTransport = null;
-                TProtocol inputProtocol = null;
-                TProtocol outputProtocol = null;
-                object connectionContext = null;
-                try
-                {
-                    try
-                    {
-                        inputTransport = inputTransportFactory.GetTransport(client);
-                        outputTransport = outputTransportFactory.GetTransport(client);
-                        inputProtocol = inputProtocolFactory.GetProtocol(inputTransport);
-                        outputProtocol = outputProtocolFactory.GetProtocol(outputTransport);
-
-                        //Recover event handler (if any) and fire createContext server event when a client connects
-                        if (serverEventHandler != null)
-                            connectionContext = serverEventHandler.createContext(inputProtocol, outputProtocol);
-
-                        //Process client requests until client disconnects
-                        while (!stop)
-                        {
-                            if (!inputTransport.Peek())
-                                break;
-
-                            //Fire processContext server event
-                            //N.B. This is the pattern implemented in C++ and the event fires provisionally.
-                            //That is to say it may be many minutes between the event firing and the client request
-                            //actually arriving or the client may hang up without ever makeing a request.
-                            if (serverEventHandler != null)
-                                serverEventHandler.processContext(connectionContext, inputTransport);
-                            //Process client request (blocks until transport is readable)
-                            if (!processor.Process(inputProtocol, outputProtocol))
-                                break;
-                        }
-                    }
-                    catch (TTransportException)
-                    {
-                        //Usually a client disconnect, expected
-                    }
-                    catch (Exception x)
-                    {
-                        //Unexpected
-                        logDelegate("Error: " + x);
-                    }
-
-                    //Fire deleteContext server event after client disconnects
-                    if (serverEventHandler != null)
-                        serverEventHandler.deleteContext(connectionContext, inputProtocol, outputProtocol);
-
-                }
-                finally
-                {
-                    //Close transports
-                    if (inputTransport != null)
-                        inputTransport.Close();
-                    if (outputTransport != null)
-                        outputTransport.Close();
-
-                    // disposable stuff should be disposed
-                    if (inputProtocol != null)
-                        inputProtocol.Dispose();
-                    if (outputProtocol != null)
-                        outputProtocol.Dispose();
-                    if (inputTransport != null)
-                        inputTransport.Dispose();
-                    if (outputTransport != null)
-                        outputTransport.Dispose();
-                }
-            }
-        }
-
-        public override void Stop()
-        {
-            stop = true;
-            serverTransport.Close();
-        }
-    }
-}
diff --git a/lib/csharp/src/Server/TThreadedServer.cs b/lib/csharp/src/Server/TThreadedServer.cs
deleted file mode 100644
index cc051a3..0000000
--- a/lib/csharp/src/Server/TThreadedServer.cs
+++ /dev/null
@@ -1,282 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Threading;
-using Thrift.Collections;
-using Thrift.Protocol;
-using Thrift.Transport;
-
-namespace Thrift.Server
-{
-    /// <summary>
-    /// Server that uses C# threads (as opposed to the ThreadPool) when handling requests.
-    /// </summary>
-    public class TThreadedServer : TServer
-    {
-        private const int DEFAULT_MAX_THREADS = 100;
-        private volatile bool stop = false;
-        private readonly int maxThreads;
-
-        private Queue<TTransport> clientQueue;
-        private THashSet<Thread> clientThreads;
-        private object clientLock;
-        private Thread workerThread;
-
-        public int ClientThreadsCount
-        {
-            get { return clientThreads.Count; }
-        }
-
-        public TThreadedServer(TProcessor processor, TServerTransport serverTransport)
-            : this(new TSingletonProcessorFactory(processor), serverTransport,
-             new TTransportFactory(), new TTransportFactory(),
-             new TBinaryProtocol.Factory(), new TBinaryProtocol.Factory(),
-             DEFAULT_MAX_THREADS, DefaultLogDelegate)
-        {
-        }
-
-        public TThreadedServer(TProcessor processor, TServerTransport serverTransport, LogDelegate logDelegate)
-            : this(new TSingletonProcessorFactory(processor), serverTransport,
-             new TTransportFactory(), new TTransportFactory(),
-             new TBinaryProtocol.Factory(), new TBinaryProtocol.Factory(),
-             DEFAULT_MAX_THREADS, logDelegate)
-        {
-        }
-
-
-        public TThreadedServer(TProcessor processor,
-                     TServerTransport serverTransport,
-                     TTransportFactory transportFactory,
-                     TProtocolFactory protocolFactory)
-            : this(new TSingletonProcessorFactory(processor), serverTransport,
-             transportFactory, transportFactory,
-             protocolFactory, protocolFactory,
-             DEFAULT_MAX_THREADS, DefaultLogDelegate)
-        {
-        }
-
-        public TThreadedServer(TProcessorFactory processorFactory,
-               TServerTransport serverTransport,
-               TTransportFactory transportFactory,
-               TProtocolFactory protocolFactory)
-            : this(processorFactory, serverTransport,
-             transportFactory, transportFactory,
-             protocolFactory, protocolFactory,
-             DEFAULT_MAX_THREADS, DefaultLogDelegate)
-        {
-        }
-        public TThreadedServer(TProcessorFactory processorFactory,
-                     TServerTransport serverTransport,
-                     TTransportFactory inputTransportFactory,
-                     TTransportFactory outputTransportFactory,
-                     TProtocolFactory inputProtocolFactory,
... 9780 lines suppressed ...