我们正在使用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文件就可以了。
答案 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
条目,但我可以在检查之前检查它。