Benchmarking, dumping and munging
diff --git a/src/ProtoDump/Program.cs b/src/ProtoDump/Program.cs
new file mode 100644
index 0000000..0c66c93
--- /dev/null
+++ b/src/ProtoDump/Program.cs
@@ -0,0 +1,43 @@
+using System;
+using System.IO;
+using System.Reflection;
+using Google.ProtocolBuffers;
+
+namespace ProtoDump {
+  /// <summary>
+  /// Small utility to load a binary message and dump it in text form
+  /// </summary>
+  class Program {
+    static int Main(string[] args) {
+      if (args.Length != 2) {
+        Console.Error.WriteLine("Usage: ProtoDump <descriptor type name> <input data>");
+        Console.Error.WriteLine("The descriptor type name is the fully-qualified message name,");
+        Console.Error.WriteLine("including assembly e.g. ProjectNamespace.Message,Company.Project");
+        return 1;
+      }
+      IMessage defaultMessage;
+      try {
+        defaultMessage = MessageUtil.GetDefaultMessage(args[0]);
+      } catch (ArgumentException e) {
+        Console.Error.WriteLine(e.Message);
+        return 1;
+      }
+      try {
+        IBuilder builder = defaultMessage.WeakCreateBuilderForType();
+        if (builder == null) {
+          Console.Error.WriteLine("Unable to create builder");
+          return 1;
+        }
+        byte[] inputData = File.ReadAllBytes(args[1]);
+        builder.WeakMergeFrom(ByteString.CopyFrom(inputData));
+        Console.WriteLine(TextFormat.PrintToString(builder.WeakBuild()));
+        return 0;
+      } catch (Exception e) {
+        Console.Error.WriteLine("Error: {0}", e.Message);
+        Console.Error.WriteLine();
+        Console.Error.WriteLine("Detailed exception information: {0}", e);
+        return 1;
+      }
+    }
+  }
+}