2

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

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

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

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

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

如果我将 .cs 文件添加到项目中,则会出现构建失败,因为 .cs 文件已Compile两次添加到项目组中。

我知道 Marc 的 protobuf-net 具有 Visual Studio 2008的优点,我正在寻找类似的东西,但适用于 Jon 的 protobuf-csharp-port 和 Visual Studio 2010。

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

我猜想 .xsd 文件如何隐式生成 .cs 文件之类的东西可以解决问题。

4

2 回答 2

1

我试图通过实现一个用于代码生成的自定义工具来实现这一点,但我遇到了一个看似无法克服的障碍:

protoc获取一个充满.proto文件的目录并生成一个.protobin文件。然后将其提供ProtoGen给每个协议定义的 .cs 文件。不幸的是,该.protobin文件似乎需要包含所有定义,否则您会收到Error: Unable to resolve all dependencies

由于 Visual Studio 中的自定义工具模型假设有一个输入文件和一个输出文件(即 foo.proto -> foo.cs),因此看起来这不能正常工作。

至少,无论如何,不​​是没有找到某种方法将所有foo.proto导入的.proto文件包含在 中foo.protobin

于 2010-05-06T14:20:17.163 回答
1

我通过CreateItemCompileProtos目标中删除来解决它,并将其定义为适当的ItemGroup

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

这意味着 Visual Studio(和 ReSharper)在构建 .cs 文件后会正确提取它们,并且 ReSharper 的完整解决方案分析不再抱怨。

不幸的是,Visual Studio 习惯于将其扩展ItemGroup为单个Compile条目,但我可以在签入任何内容之前对其进行检查。

于 2010-05-11T14:48:32.790 回答