소스 검색

Initial setup of generator code. Little real functionality so far.

Jon Skeet 17 년 전
부모
커밋
7fd62ffd77

+ 4 - 0
.gitignore

@@ -4,6 +4,10 @@ csharp/ProtocolBuffers/bin/
 csharp/ProtocolBuffers/obj/
 csharp/ProtocolBuffers.Test/bin/
 csharp/ProtocolBuffers.Test/obj/
+csharp/ProtoGen/bin/
+csharp/ProtoGen/obj/
+csharp/ProtoGen.Test/bin/
+csharp/ProtoGen.Test/obj/
 csharp/TestBed
 java/.classpath
 java/.project

+ 17 - 0
csharp/ProtoGen.Test/DependencyResolutionTest.cs

@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+
+namespace ProtoGen {
+  /// <summary>
+  /// Tests for the dependency resolution in Generator.
+  /// </summary>
+  [TestFixture]
+  public class DependencyResolutionTest {
+
+    [Test]
+    public void TwoDistinctFiles() {
+    }
+  }
+}

+ 7 - 0
csharp/ProtoGen.Test/GeneratorTest.cs

@@ -0,0 +1,7 @@
+using NUnit.Framework;
+
+namespace ProtoGen {
+  [TestFixture]
+  public class GeneratorTest {
+  }
+}

+ 36 - 0
csharp/ProtoGen.Test/Properties/AssemblyInfo.cs

@@ -0,0 +1,36 @@
+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("ProtoGen.Test")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ProtoGen.Test")]
+[assembly: AssemblyCopyright("Copyright ©  2008")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 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("40720ee3-2d15-4271-8c42-8f9cfd01b52f")]
+
+// 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("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

BIN
csharp/ProtoGen.Test/Properties/Google.ProtocolBuffers.ProtoGen.Test.snk


+ 72 - 0
csharp/ProtoGen.Test/ProtoGen.Test.csproj

@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{C268DA4C-4004-47DA-AF23-44C983281A68}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>ProtoGen</RootNamespace>
+    <AssemblyName>Google.ProtocolBuffers.ProtoGen.Test</AssemblyName>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>Properties\Google.ProtocolBuffers.ProtoGen.Test.snk</AssemblyOriginatorKeyFile>
+  </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>
+  </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>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework, Version=2.2.8.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\lib\nunit.framework.dll</HintPath>
+    </Reference>
+    <Reference Include="Rhino.Mocks, Version=3.5.0.2, Culture=neutral, PublicKeyToken=0b3305902db7183f, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\lib\Rhino.Mocks.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="DependencyResolutionTest.cs" />
+    <Compile Include="GeneratorTest.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\ProtocolBuffers\ProtocolBuffers.csproj">
+      <Project>{6908BDCE-D925-43F3-94AC-A531E6DF2591}</Project>
+      <Name>ProtocolBuffers</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\ProtoGen\ProtoGen.csproj">
+      <Project>{250ADE34-82FD-4BAE-86D5-985FBE589C4A}</Project>
+      <Name>ProtoGen</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Properties\Google.ProtocolBuffers.ProtoGen.Test.snk" />
+  </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>

+ 17 - 0
csharp/ProtoGen/DependencyResolutionException.cs

@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Google.ProtocolBuffers.ProtoGen {
+  /// <summary>
+  /// Exception thrown when dependencies within a descriptor set can't be resolved.
+  /// </summary>
+  public sealed class DependencyResolutionException : Exception {
+    public DependencyResolutionException(string message) : base(message) {
+    }
+
+    public DependencyResolutionException(string format, params object[] args) 
+        : base(string.Format(format, args)) {
+    }
+  }
+}

+ 47 - 0
csharp/ProtoGen/Generator.cs

@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+using Google.ProtocolBuffers.DescriptorProtos;
+using System.IO;
+using Google.ProtocolBuffers.Descriptors;
+
+namespace Google.ProtocolBuffers.ProtoGen {
+  /// <summary>
+  /// Code generator for protocol buffers. Only C# is supported at the moment.
+  /// </summary>
+  public sealed class Generator {
+
+    readonly GeneratorOptions options;
+
+    private Generator(GeneratorOptions options) {
+      options.Validate();
+      this.options = options;
+    }
+
+    /// <summary>
+    /// Returns a generator configured with the specified options.
+    /// </summary>
+    public static Generator CreateGenerator(GeneratorOptions options) {
+      return new Generator(options);
+    }
+
+    public void Generate() {
+      foreach (string inputFile in options.InputFiles) {
+        FileDescriptorSet descriptorProtos;
+        using (Stream inputStream = File.OpenRead(inputFile)) {
+          descriptorProtos = FileDescriptorSet.ParseFrom(inputStream);
+        }
+        List<FileDescriptor> descriptors = ConvertDescriptors(descriptorProtos);
+      }
+    }
+
+    /// <summary>
+    /// Resolves any dependencies and converts FileDescriptorProtos into FileDescriptors.
+    /// The list returned is in the same order as the protos are listed in the descriptor set.
+    /// Note: this method is internal rather than private to allow testing.
+    /// </summary>
+    /// <exception cref="DependencyResolutionException">Not all dependencies could be resolved.</exception>
+    internal static List<FileDescriptor> ConvertDescriptors(FileDescriptorSet descriptorProtos) {
+      return null;
+    }
+  }
+}

+ 69 - 0
csharp/ProtoGen/GeneratorOptions.cs

@@ -0,0 +1,69 @@
+using System.Collections.Generic;
+using System.IO;
+
+namespace Google.ProtocolBuffers.ProtoGen {
+
+  /// <summary>
+  /// All the configuration required for the generator - where to generate
+  /// output files, the location of input files etc. While this isn't immutable
+  /// in practice, the contents shouldn't be changed after being passed to
+  /// the generator.
+  /// </summary>
+  public sealed class GeneratorOptions {
+
+    public string OutputDirectory { get; set; }
+    public IList<string> InputFiles { get; set; }
+
+    /// <summary>
+    /// Attempts to validate the options, but doesn't throw an exception if they're invalid.
+    /// Instead, when this method returns false, the output variable will contain a collection
+    /// of reasons for the validation failure.
+    /// </summary>
+    /// <param name="reasons">Variable to receive a list of reasons in case of validation failure.</param>
+    /// <returns>true if the options are valid; false otherwise</returns>
+    public bool TryValidate(out IList<string> reasons) {
+      List<string> tmpReasons = new List<string>();
+
+      // Output directory validation
+      if (string.IsNullOrEmpty(OutputDirectory)) {
+        tmpReasons.Add("No output directory specified");
+      } else {
+        if (!Directory.Exists(OutputDirectory)) {
+          tmpReasons.Add("Specified output directory (" + OutputDirectory + " doesn't exist.");
+        }
+      }
+
+      // Input file validation (just in terms of presence)
+      if (InputFiles == null || InputFiles.Count == 0) {
+        tmpReasons.Add("No input files specified");
+      } else {
+        foreach (string input in InputFiles) {
+          FileInfo fi = new FileInfo(input);
+          if (!fi.Exists) {
+            tmpReasons.Add("Input file " + input + " doesn't exist.");
+          }
+        }
+      }
+
+      if (tmpReasons.Count != 0) {
+        reasons = tmpReasons;
+        return false;
+      }
+
+      reasons = null;
+      return true;
+    }
+
+    /// <summary>
+    /// Validates that all the options have been set and are valid,
+    /// throwing an exception if they haven't.
+    /// </summary>
+    /// <exception cref="InvalidOptionsException">The options are invalid.</exception>
+    public void Validate() {
+      IList<string> reasons;
+      if (!TryValidate(out reasons)) {
+        throw new InvalidOptionsException(reasons);
+      }
+    }
+  }
+}

+ 36 - 0
csharp/ProtoGen/InvalidOptionsException.cs

@@ -0,0 +1,36 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Google.ProtocolBuffers.Collections;
+
+namespace Google.ProtocolBuffers.ProtoGen {
+  /// <summary>
+  /// Exception thrown to indicate that the options passed were invalid.
+  /// </summary>
+  public sealed class InvalidOptionsException : Exception {
+
+    private readonly IList<string> reasons;
+
+    /// <summary>
+    /// An immutable list of reasons why the options were invalid.
+    /// </summary>
+    public IList<string> Reasons {
+      get { return reasons; }
+    }
+
+    public InvalidOptionsException(IList<string> reasons) 
+        : base(BuildMessage(reasons)) {
+      this.reasons = Lists.AsReadOnly(reasons);
+    }
+
+    private static string BuildMessage(IEnumerable<string> reasons) {
+      StringBuilder builder = new StringBuilder("Invalid options:");
+      builder.AppendLine();
+      foreach (string reason in reasons) {
+        builder.Append("  ");
+        builder.AppendLine(reason);
+      }
+      return builder.ToString();
+    }
+  }
+}

+ 41 - 0
csharp/ProtoGen/Program.cs

@@ -0,0 +1,41 @@
+using System;
+using System.Collections.Generic;
+
+namespace Google.ProtocolBuffers.ProtoGen {
+  /// <summary>
+  /// Entry point for the Protocol Buffers generator.
+  /// </summary>
+  class Program {
+    static int Main(string[] args) {
+      try {
+
+        GeneratorOptions options = ParseCommandLineArguments(args);
+
+        IList<string> validationFailures;
+        if (!options.TryValidate(out validationFailures)) {
+          // We've already got the message-building logic in the exception...
+          InvalidOptionsException exception = new InvalidOptionsException(validationFailures);
+          Console.WriteLine(exception.Message);
+          return 1;
+        }
+
+        Generator generator = Generator.CreateGenerator(options);
+        generator.Generate();
+
+
+        return 0;
+      } catch (Exception e) {
+        Console.Error.WriteLine("Caught unhandled exception: {0}", e);
+        return 1;
+      }
+    }
+
+    private static GeneratorOptions ParseCommandLineArguments(string[] args) {
+      GeneratorOptions options = new GeneratorOptions();
+      string baseDir = "c:\\Users\\Jon\\Documents\\Visual Studio 2008\\Projects\\ProtocolBuffers";
+      options.OutputDirectory = baseDir + "\\tmp";
+      options.InputFiles = new[] { baseDir + "\\protos\\nwind.protobin" };
+      return options;
+    }
+  }
+}

+ 42 - 0
csharp/ProtoGen/Properties/AssemblyInfo.cs

@@ -0,0 +1,42 @@
+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("ProtoGen")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ProtoGen")]
+[assembly: AssemblyCopyright("Copyright ©  2008")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 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("7101763b-7a38-41be-87f5-7ede4c554509")]
+
+// 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("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: InternalsVisibleTo("Google.ProtocolBuffers.ProtoGen.Test,PublicKey=" +
+"0024000004800000940000000602000000240000525341310004000001000100cf43741ffc3e65" +
+"c85707245e144e90f1bb82f20d1b1555846008d4d5d5c9270a980350dcb1ddd40fcdde13c2780c" +
+"75c9057123daa5613cb6551e2b8bd2254e8f84b3893369869e5119b752442aef7156c4defc489b" +
+"96c44ff801fe8d94199e048f8ff414813c9c811a029bcd697040700dc66982539e9b368cb5e725" +
+"feed60f2")]

BIN
csharp/ProtoGen/Properties/Google.ProtocolBuffers.ProtoGen.snk


+ 66 - 0
csharp/ProtoGen/ProtoGen.csproj

@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{250ADE34-82FD-4BAE-86D5-985FBE589C4A}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Google.ProtocolBuffers.ProtoGen</RootNamespace>
+    <AssemblyName>ProtoGen</AssemblyName>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkSubset>
+    </TargetFrameworkSubset>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>Properties\Google.ProtocolBuffers.ProtoGen.snk</AssemblyOriginatorKeyFile>
+  </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>
+  </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>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="DependencyResolutionException.cs" />
+    <Compile Include="Generator.cs" />
+    <Compile Include="GeneratorOptions.cs" />
+    <Compile Include="InvalidOptionsException.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config" />
+    <None Include="Properties\Google.ProtocolBuffers.ProtoGen.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\ProtocolBuffers\ProtocolBuffers.csproj">
+      <Project>{6908BDCE-D925-43F3-94AC-A531E6DF2591}</Project>
+      <Name>ProtocolBuffers</Name>
+    </ProjectReference>
+  </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>

+ 3 - 0
csharp/ProtoGen/app.config

@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<configuration>
+<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>

+ 0 - 0
csharp/ProtocolBuffers.Test/Properties/ProtocolBuffers.Test.snk → csharp/ProtocolBuffers.Test/Properties/Google.ProtocolBuffers.Test.snk


+ 4 - 4
csharp/ProtocolBuffers.Test/ProtocolBuffers.Test.csproj

@@ -13,7 +13,7 @@
     <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
     <SignAssembly>true</SignAssembly>
-    <AssemblyOriginatorKeyFile>Properties\ProtocolBuffers.Test.snk</AssemblyOriginatorKeyFile>
+    <AssemblyOriginatorKeyFile>Properties\Google.ProtocolBuffers.Test.snk</AssemblyOriginatorKeyFile>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -35,11 +35,11 @@
   <ItemGroup>
     <Reference Include="nunit.framework, Version=2.2.8.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>lib\nunit.framework.dll</HintPath>
+      <HintPath>..\lib\nunit.framework.dll</HintPath>
     </Reference>
     <Reference Include="Rhino.Mocks, Version=3.5.0.2, Culture=neutral, PublicKeyToken=0b3305902db7183f, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>lib\Rhino.Mocks.dll</HintPath>
+      <HintPath>..\lib\Rhino.Mocks.dll</HintPath>
     </Reference>
     <Reference Include="System" />
   </ItemGroup>
@@ -79,7 +79,7 @@
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
-    <None Include="Properties\ProtocolBuffers.Test.snk" />
+    <None Include="Properties\Google.ProtocolBuffers.Test.snk" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 

+ 0 - 0
csharp/ProtocolBuffers.Test/lib/Rhino.Mocks.dll → csharp/lib/Rhino.Mocks.dll


+ 0 - 0
csharp/ProtocolBuffers.Test/lib/Rhino.Mocks.xml → csharp/lib/Rhino.Mocks.xml


+ 0 - 0
csharp/ProtocolBuffers.Test/lib/nunit-license.txt → csharp/lib/nunit-license.txt


+ 0 - 0
csharp/ProtocolBuffers.Test/lib/nunit.framework.dll → csharp/lib/nunit.framework.dll


+ 0 - 0
csharp/ProtocolBuffers.Test/lib/rhino-license.txt → csharp/lib/rhino-license.txt


+ 28 - 1
vsprojects/protobuf.sln

@@ -27,6 +27,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtocolBuffers.Test", "..\
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestBed", "..\csharp\TestBed\TestBed.csproj", "{BFA454A0-63F3-4850-BE9C-8CACD242EB50}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtoGen", "..\csharp\ProtoGen\ProtoGen.csproj", "{250ADE34-82FD-4BAE-86D5-985FBE589C4A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtoGen.Test", "..\csharp\ProtoGen.Test\ProtoGen.Test.csproj", "{C268DA4C-4004-47DA-AF23-44C983281A68}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -75,7 +79,6 @@ Global
 		{4DF72760-C055-40A5-A77E-30A17E2AC2DB}.Release|Mixed Platforms.ActiveCfg = Release|Win32
 		{4DF72760-C055-40A5-A77E-30A17E2AC2DB}.Release|Mixed Platforms.Build.0 = Release|Win32
 		{4DF72760-C055-40A5-A77E-30A17E2AC2DB}.Release|Win32.ActiveCfg = Release|Win32
-		{4DF72760-C055-40A5-A77E-30A17E2AC2DB}.Release|Win32.Build.0 = Release|Win32
 		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -112,6 +115,30 @@ Global
 		{BFA454A0-63F3-4850-BE9C-8CACD242EB50}.Release|Mixed Platforms.Build.0 = Release|Any CPU
 		{BFA454A0-63F3-4850-BE9C-8CACD242EB50}.Release|Win32.ActiveCfg = Release|Any CPU
 		{BFA454A0-63F3-4850-BE9C-8CACD242EB50}.Release|Win32.Build.0 = Release|Any CPU
+		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Debug|Win32.Build.0 = Debug|Any CPU
+		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Release|Win32.ActiveCfg = Release|Any CPU
+		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Release|Win32.Build.0 = Release|Any CPU
+		{C268DA4C-4004-47DA-AF23-44C983281A68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{C268DA4C-4004-47DA-AF23-44C983281A68}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{C268DA4C-4004-47DA-AF23-44C983281A68}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{C268DA4C-4004-47DA-AF23-44C983281A68}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{C268DA4C-4004-47DA-AF23-44C983281A68}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{C268DA4C-4004-47DA-AF23-44C983281A68}.Debug|Win32.Build.0 = Debug|Any CPU
+		{C268DA4C-4004-47DA-AF23-44C983281A68}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{C268DA4C-4004-47DA-AF23-44C983281A68}.Release|Any CPU.Build.0 = Release|Any CPU
+		{C268DA4C-4004-47DA-AF23-44C983281A68}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{C268DA4C-4004-47DA-AF23-44C983281A68}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{C268DA4C-4004-47DA-AF23-44C983281A68}.Release|Win32.ActiveCfg = Release|Any CPU
+		{C268DA4C-4004-47DA-AF23-44C983281A68}.Release|Win32.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE