前段時間研究一個java程序,增長一些功能。其中用到java和C#的通訊。天然,有多種辦法,後來其實是用javascript調用C#的REST WCF服務實現的。可是在查資料的過程當中,發現有個Protocol Buffers的東東,Google開發的,也能夠用。出於好奇,試了下。Java那頭用Maven編譯,C#這頭,可用MSBuild編譯,但須要作些配置。javascript
假設工程中有這些文件:test.proto,testClient.cs(調用gRPC客戶端),但願按一下F5就編譯好,怎麼作呢?java
1. 下載和安裝NuGet包:Grpc, Grpc.Tools, Grpc.Tools.MSBuild.Unofficial, Google.Protobuf (注意,還有個Google.ProtocolBuffers的包,不要混起來)ui
2. 修改Grpc.Tools.MsBuild.Unofficial.props文件,把GrpcToolsVersion的值改爲實際使用的值(目前最新版是1.15.0)ip
3. 修改Grpc.Tools.MsBuild.Unofficial.targets文件ci
1)把_GrpcOutputFolder的值改成$(IntermediateOutputPath) 固然,改爲其餘值也行,可是若目錄不存在須要增長一個建目錄的過程,比較麻煩。$(IntermediateOutputPath)的位置是obj\Debug,系統缺省就有了,比較方便,放在這個地方也比較合適開發
2)把GrpcToolsPath的值改成$(MSBuildThisFileDirectory)..\..\grpc.tools.$(GrpcToolsVersion)\tools\,原來的路徑不對,編譯時會報錯。rpc
3)將 <Target Name="GenerateGrpcFiles" 後面的屬性BeforeTargets的值改爲PrepareForBuildget
4. 修改工程文件,假設文件名爲testGRPC.csproj:it
1)將io
<Import Project="..\packages\Grpc.Tools.MsBuild.Unofficial.1.0.51\build\Grpc.Tools.MsBuild.Unofficial.targets" Condition="Exists('..\packages\Grpc.Tools.MsBuild.Unofficial.1.0.51\build\Grpc.Tools.MsBuild.Unofficial.targets')" /> 這一行移到
<Import Project="..\packages\Grpc.Core.1.15.0\build\net45\Grpc.Core.targets" Condition="Exists('..\packages\Grpc.Core.1.15.0\build\net45\Grpc.Core.targets')" />的後面一行
2)將<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />移到最後一個<Target>的後面一行
如今,按F5,就會一步編譯好。