Visual Studio 2010和protobuf-csharp-port

时间:2010-05-06 12:56:06

标签: visual-studio-2010 protocol-buffers custom-build-step

我们正在使用Jon Skeet的proto-csharp-port,在Visual Studio 2010中将它与ReSharper混合使用时遇到了一些困难。

我们通过自定义MSBuild目标生成.cs文件,连接如下:

<Target Name="BeforeBuild" DependsOnTargets="CompileProtos" />

CompileProtos目标运行ProtoGen,然后使用@(Compile)将生成的.cs文件添加到CreateItem项目组。它查找定义的目录并编译它找到的每个.proto文件,因此它们不会列在项目中。

它倒下的地方是ReSharper无法识别.cs文件的内容(因为它们不在项目中并且可能还不存在),所以我无法让解决方案分析指示灯变为绿色

如果我将.cs文件添加到项目中,那么我的构建失败,因为.cs文件已被添加到Compile项目组两次。

我知道Marc的protobuf-net中有Visual Studio 2008 goodness,我正在寻找类似的东西,但是对于Jon的protobuf-csharp-port和Visual Studio 2010。

理想情况下,我希望能够将.proto文件添加到项目中,正确构建它们,并让Visual Studio和ReSharper了解生成的.cs文件,以便IntelliSense和解决方案分析正常工作。

我猜测像.xsd文件如何隐式生成.cs文件就可以了。

2 个答案:

答案 0 :(得分:1)

我试图通过为custom tool实施code generation来实现这一目标,但我遇到了一个看似无法克服的障碍:

protoc获取一个充满.proto个文件的目录,并生成.protobin个文件。然后将其传送到ProtoGen,为每个协议定义吐出一个.cs文件。不幸的是,.protobin文件似乎需要包含所有定义,否则会出现错误:无法解析所有依赖项

由于Visual Studio中的自定义工具模型假定单个输入文件和单个输出文件(即foo.proto - &gt; foo.cs),因此看起来不能使其工作。

至少,无论如何都要找到一些方法在foo.proto中包含所有.proto个导入的foo.protobin文件。

答案 1 :(得分:1)

我通过从CreateItem目标移除CompileProtos并将其定义为正确ItemGroup来解决此问题:

<ItemGroup>
  <Protocols Include="$(ProtocolsPath)\*.proto"/>
</ItemGroup>
<ItemGroup>
  <Compile Include="@(Protocols -> '%(Filename).cs')"/>
</ItemGroup>

这意味着Visual Studio(和ReSharper)在构建完成后会正确地获取.cs文件,并且ReSharper的完整解决方案分析会停止抱怨。

不幸的是,Visual Studio习惯将ItemGroup扩展为单个Compile条目,但我可以在检查之前检查它。