diff --git a/build/Common.targets b/build/Common.targets
index 59f431bd47..7e65b75ffa 100644
--- a/build/Common.targets
+++ b/build/Common.targets
@@ -27,6 +27,8 @@
+
+
diff --git a/build/build.csproj b/build/build.csproj
index b6edf2b90b..a0fcefa2d8 100644
--- a/build/build.csproj
+++ b/build/build.csproj
@@ -54,9 +54,8 @@
-
-
+
$(SourceDirectory)\ProtocolBuffers\DescriptorProtos
@@ -64,7 +63,7 @@
$(SourceDirectory)\ProtocolBuffers\DescriptorProtos
-
+
$(SourceDirectory)\AddressBook
diff --git a/protos/tutorial/addressbook.proto b/protos/tutorial/addressbook.proto
index 72806f32c4..da019424ff 100644
--- a/protos/tutorial/addressbook.proto
+++ b/protos/tutorial/addressbook.proto
@@ -1,10 +1,5 @@
package tutorial;
-import "google/protobuf/csharp_options.proto";
-
-option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.Examples.AddressBook";
-option (google.protobuf.csharp_file_options).umbrella_classname = "AddressBookProtos";
-
option optimize_for = SPEED;
message Person {
diff --git a/src/AddressBook/AddressBookProtos.cs b/src/AddressBook/AddressBookProtos.cs
index e544e4c7a6..38029ac6c2 100644
--- a/src/AddressBook/AddressBookProtos.cs
+++ b/src/AddressBook/AddressBookProtos.cs
@@ -31,16 +31,13 @@ namespace Google.ProtocolBuffers.Examples.AddressBook {
static AddressBookProtos() {
byte[] descriptorData = global::System.Convert.FromBase64String(
- "Chp0dXRvcmlhbC9hZGRyZXNzYm9vay5wcm90bxIIdHV0b3JpYWwaJGdvb2ds" +
- "ZS9wcm90b2J1Zi9jc2hhcnBfb3B0aW9ucy5wcm90byLaAQoGUGVyc29uEgwK" +
- "BG5hbWUYASACKAkSCgoCaWQYAiACKAUSDQoFZW1haWwYAyABKAkSKwoFcGhv" +
- "bmUYBCADKAsyHC50dXRvcmlhbC5QZXJzb24uUGhvbmVOdW1iZXIaTQoLUGhv" +
- "bmVOdW1iZXISDgoGbnVtYmVyGAEgAigJEi4KBHR5cGUYAiABKA4yGi50dXRv" +
- "cmlhbC5QZXJzb24uUGhvbmVUeXBlOgRIT01FIisKCVBob25lVHlwZRIKCgZN" +
- "T0JJTEUQABIICgRIT01FEAESCAoEV09SSxACIi8KC0FkZHJlc3NCb29rEiAK" +
- "BnBlcnNvbhgBIAMoCzIQLnR1dG9yaWFsLlBlcnNvbkJFSAHCPkAKK0dvb2ds" +
- "ZS5Qcm90b2NvbEJ1ZmZlcnMuRXhhbXBsZXMuQWRkcmVzc0Jvb2sSEUFkZHJl" +
- "c3NCb29rUHJvdG9z");
+ "Chp0dXRvcmlhbC9hZGRyZXNzYm9vay5wcm90bxIIdHV0b3JpYWwi2gEKBlBl" +
+ "cnNvbhIMCgRuYW1lGAEgAigJEgoKAmlkGAIgAigFEg0KBWVtYWlsGAMgASgJ" +
+ "EisKBXBob25lGAQgAygLMhwudHV0b3JpYWwuUGVyc29uLlBob25lTnVtYmVy" +
+ "Gk0KC1Bob25lTnVtYmVyEg4KBm51bWJlchgBIAIoCRIuCgR0eXBlGAIgASgO" +
+ "MhoudHV0b3JpYWwuUGVyc29uLlBob25lVHlwZToESE9NRSIrCglQaG9uZVR5" +
+ "cGUSCgoGTU9CSUxFEAASCAoESE9NRRABEggKBFdPUksQAiIvCgtBZGRyZXNz" +
+ "Qm9vaxIgCgZwZXJzb24YASADKAsyEC50dXRvcmlhbC5QZXJzb25CAkgB");
pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {
descriptor = root;
internal__static_tutorial_Person__Descriptor = Descriptor.MessageTypes[0];
@@ -55,14 +52,10 @@ namespace Google.ProtocolBuffers.Examples.AddressBook {
internal__static_tutorial_AddressBook__FieldAccessorTable =
new pb::FieldAccess.FieldAccessorTable(internal__static_tutorial_AddressBook__Descriptor,
new string[] { "Person", });
- pb::ExtensionRegistry registry = pb::ExtensionRegistry.CreateInstance();
- RegisterAllExtensions(registry);
- global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.RegisterAllExtensions(registry);
- return registry;
+ return null;
};
pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
new pbd::FileDescriptor[] {
- global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.Descriptor,
}, assigner);
}
#endregion
diff --git a/src/ProtoGen/ProgramPreprocess.cs b/src/ProtoGen/ProgramPreprocess.cs
index ed5829894c..a1ebdf6245 100644
--- a/src/ProtoGen/ProgramPreprocess.cs
+++ b/src/ProtoGen/ProgramPreprocess.cs
@@ -14,6 +14,9 @@ namespace Google.ProtocolBuffers.ProtoGen
///
public class ProgramPreprocess
{
+ const string ProtocExecutable = "protoc.exe";
+ const string ProtocDirectoryArg = "--protoc_dir=";
+
private static int Main(string[] args)
{
try
@@ -38,6 +41,8 @@ namespace Google.ProtocolBuffers.ProtoGen
List protocArgs = new List();
List protoGenArgs = new List();
+ string protocFile = GuessProtocFile(args);
+
foreach (string arg in args)
{
doHelp |= StringComparer.OrdinalIgnoreCase.Equals(arg, "/?");
@@ -59,7 +64,7 @@ namespace Google.ProtocolBuffers.ProtoGen
Console.WriteLine();
try
{
- RunProtoc("--help");
+ RunProtoc(protocFile, "--help");
}
catch (Exception ex)
{
@@ -71,11 +76,19 @@ namespace Google.ProtocolBuffers.ProtoGen
"PROTOGEN.exe: The following options are used to specify defaults for code generation.");
Console.WriteLine();
Program.Main(new string[0]);
+ Console.WriteLine();
+ Console.WriteLine("The following option enables PROTOGEN.exe to find PROTOC.exe");
+ Console.WriteLine("{0}", ProtocDirectoryArg);
return 0;
}
foreach (string arg in args)
{
+ if (arg.StartsWith(ProtocDirectoryArg))
+ {
+ // Handled earlier
+ continue;
+ }
if (arg.StartsWith("--"))
{
protocArgs.Add(arg);
@@ -100,7 +113,7 @@ namespace Google.ProtocolBuffers.ProtoGen
if (tempFile != null)
{
- result = RunProtoc(protocArgs.ToArray());
+ result = RunProtoc(protocFile, protocArgs.ToArray());
if (result != 0)
{
return result;
@@ -119,29 +132,44 @@ namespace Google.ProtocolBuffers.ProtoGen
return result;
}
- private static int RunProtoc(params string[] args)
+ ///
+ /// Tries to work out where protoc is based on command line arguments, the current
+ /// directory, the directory containing protogen, and the path.
+ ///
+ /// The path to protoc.exe, or null if it can't be found.
+ private static string GuessProtocFile(params string[] args)
{
- const string protoc = "protoc.exe";
- string exePath = protoc;
-
// Why oh why is this not in System.IO.Path or Environment...?
List searchPath = new List();
+ foreach (string arg in args)
+ {
+ if (arg.StartsWith("--protoc_dir="))
+ {
+ searchPath.Add(arg.Substring(ProtocDirectoryArg.Length));
+ }
+ }
searchPath.Add(Environment.CurrentDirectory);
searchPath.Add(AppDomain.CurrentDomain.BaseDirectory);
searchPath.AddRange((Environment.GetEnvironmentVariable("PATH") ?? String.Empty).Split(Path.PathSeparator));
foreach (string path in searchPath)
{
- if (File.Exists(exePath = Path.Combine(path, protoc)))
+ string exeFile = Path.Combine(path, ProtocExecutable);
+ if (File.Exists(exeFile))
{
- break;
+ return exeFile;
}
}
+ return null;
+ }
- if (!File.Exists(exePath))
+ private static int RunProtoc(string exeFile, params string[] args)
+ {
+ if (exeFile == null)
{
- throw new FileNotFoundException("Unable to locate " + protoc +
- " make sure it is in the PATH, cwd, or exe dir.");
+ throw new FileNotFoundException(
+ "Unable to locate " + ProtocExecutable +
+ " make sure it is in the PATH, cwd, or exe dir, or use --protoc_dir=...");
}
for (int i = 0; i < args.Length; i++)
@@ -152,7 +180,7 @@ namespace Google.ProtocolBuffers.ProtoGen
}
}
- ProcessStartInfo psi = new ProcessStartInfo(exePath);
+ ProcessStartInfo psi = new ProcessStartInfo(exeFile);
psi.Arguments = String.Join(" ", args);
psi.RedirectStandardError = true;
psi.RedirectStandardInput = false;