Skip to content
Snippets Groups Projects
README.md 7.4 KiB
Newer Older
Jan Tattermusch's avatar
Jan Tattermusch committed
A C# implementation of gRPC.
Jayant Kolhe's avatar
Jayant Kolhe committed
Status
Jan Tattermusch's avatar
Jan Tattermusch committed
------
Jan Tattermusch's avatar
Jan Tattermusch committed
Alpha : Ready for early adopters.
Jan Tattermusch's avatar
Jan Tattermusch committed
Usage: Windows
--------------
Jan Tattermusch's avatar
Jan Tattermusch committed
- Prerequisites: .NET Framework 4.5+, Visual Studio 2013 with NuGet extension installed (VS2015 should work).
Jan Tattermusch's avatar
Jan Tattermusch committed
- Open Visual Studio and start a new project/solution.
Jan Tattermusch's avatar
Jan Tattermusch committed

Jan Tattermusch's avatar
Jan Tattermusch committed
- Add NuGet package `Grpc` as a dependency (Project options -> Manage NuGet Packages).
  That will also pull all the transitive dependencies (including the native libraries that
  gRPC C# is internally using).
Jan Tattermusch's avatar
Jan Tattermusch committed

- Helloworld project example can be found in https://github.com/grpc/grpc/tree/master/examples/csharp.
Jan Tattermusch's avatar
Jan Tattermusch committed

Jan Tattermusch's avatar
Jan Tattermusch committed
Usage: Linux (Mono)
--------------
Jan Tattermusch's avatar
Jan Tattermusch committed
- Prerequisites: Mono 3.2.8+, MonoDevelop 5.9 with NuGet add-in installed.
Jan Tattermusch's avatar
Jan Tattermusch committed
- Install Linuxbrew and gRPC C Core using instructions in https://github.com/grpc/homebrew-grpc
Jan Tattermusch's avatar
Jan Tattermusch committed
- gRPC C# depends on native shared library libgrpc_csharp_ext.so (Unix flavor of grpc_csharp_ext.dll).
  This library will be installed to `~/.linuxbrew/lib` by the previous step.
  To make it visible to mono, you need to:

  - (preferred approach) add `libgrpc_csharp_ext.so` to `/etc/ld.so.cache` by running:

    ```sh
    $ echo "$HOME/.linuxbrew/lib" | sudo tee /etc/ld.so.conf.d/zzz_brew_lib.conf
    $ sudo ldconfig
Jan Tattermusch's avatar
Jan Tattermusch committed
    ```

  - (adhoc approach) set `LD_LIBRARY_PATH` environment variable to point to directory containing `libgrpc_csharp_ext.so`:

    ```sh
    $ export LD_LIBRARY_PATH=$HOME/.linuxbrew/lib:${LD_LIBRARY_PATH}
Jan Tattermusch's avatar
Jan Tattermusch committed
    ```
  - (if you are contributor) installing gRPC from sources using `sudo make install_grpc_csharp_ext` also works.
Jan Tattermusch's avatar
Jan Tattermusch committed

- Open MonoDevelop and start a new project/solution.

- Add NuGet package `Grpc` as a dependency (Project -> Add NuGet packages).

- Helloworld project example can be found in https://github.com/grpc/grpc/tree/master/examples/csharp.
Jan Tattermusch's avatar
Jan Tattermusch committed

Usage: MacOS (Mono)
--------------

- WARNING: As of now gRPC C# only works on 64bit version of Mono (because we don't compile
  the native extension for C# in 32bit mode yet). That means your development experience
  with Xamarin Studio on MacOS will not be great, as you won't be able to run your
  code directly from Xamarin Studio (which requires 32bit version of Mono).

- Prerequisites: Xamarin Studio with NuGet add-in installed.

- Install Homebrew and gRPC C Core using instructions in https://github.com/grpc/homebrew-grpc

- Install 64-bit version of mono with command `brew install mono` (assumes you've already installed Homebrew).

- Open Xamarin Studio and start a new project/solution.

- Add NuGet package `Grpc` as a dependency (Project -> Add NuGet packages).

- *You will be able to build your project in Xamarin Studio, but to run or test it,
  you will need to run it under 64-bit version of Mono.*

- Helloworld project example can be found in https://github.com/grpc/grpc/tree/master/examples/csharp.
Jan Tattermusch's avatar
Jan Tattermusch committed

Building: Windows
-----------------

You only need to go through these steps if you are planning to develop gRPC C#.
If you are a user of gRPC C#, go to Usage section above.

- Prerequisites for development: NET Framework 4.5+, Visual Studio 2013 (with NuGet and NUnit extensions installed).

- The grpc_csharp_ext native library needs to be built so you can build the Grpc C# solution. You can 
  either build the native solution in `vsprojects/grpc.sln` from Visual Studio manually, or you can use
  a convenience batch script that builds everything for you.
Jan Tattermusch's avatar
Jan Tattermusch committed

  ```
  > buildall.bat
Jan Tattermusch's avatar
Jan Tattermusch committed
  ```
Jan Tattermusch's avatar
Jan Tattermusch committed
- Open Grpc.sln using Visual Studio 2013. NuGet dependencies will be restored
  upon build (you need to have NuGet add-in installed).


Building: Linux (Mono)
Jan Tattermusch's avatar
Jan Tattermusch committed
----------------------

You only need to go through these steps if you are planning to develop gRPC C#.
If you are a user of gRPC C#, go to Usage section above.

Jan Tattermusch's avatar
Jan Tattermusch committed
- Prerequisites for development: Mono 3.2.8+, MonoDevelop 5.9 with NuGet and NUnit add-ins installed.

  ```sh
  $ sudo apt-get install mono-devel
  $ sudo apt-get install nunit nunit-console
Jan Tattermusch's avatar
Jan Tattermusch committed
  ```
Jan Tattermusch's avatar
Jan Tattermusch committed
You can use older versions of MonoDevelop, but then you might need to restore
NuGet dependencies manually (by `nuget restore`), because older versions of MonoDevelop
don't support NuGet add-in.
Jan Tattermusch's avatar
Jan Tattermusch committed
- Compile and install the gRPC C# extension library (that will be used via
  P/Invoke from C#).
Jan Tattermusch's avatar
Jan Tattermusch committed
  ```sh
  $ make grpc_csharp_ext
  $ sudo make install_grpc_csharp_ext
Jan Tattermusch's avatar
Jan Tattermusch committed
  ```
Jan Tattermusch's avatar
Jan Tattermusch committed
- Use MonoDevelop to open the solution Grpc.sln

- Build the solution & run all the tests from test view.

Tests
-----
Jan Tattermusch's avatar
Jan Tattermusch committed
gRPC C# is using NUnit as the testing framework.

Under Visual Studio, make sure NUnit test adapter is installed (under "Extensions and Updates").
Then you should be able to run all the tests using Test Explorer.

Under Monodevelop, make sure you installed "NUnit support" in Add-in manager.
Then you should be able to run all the test from the Test View.

After building the solution, you can also run the tests from command line 
using nunit-console tool.
Jan Tattermusch's avatar
Jan Tattermusch committed
# from Grpc.Core.Test/bin/Debug directory
$ nunit-console Grpc.Core.Tests.dll
Jan Tattermusch's avatar
Jan Tattermusch committed
Contents
--------

- ext:
  The extension library that wraps C API to be more digestible by C#.
Jan Tattermusch's avatar
Jan Tattermusch committed
- Grpc.Auth:
  gRPC OAuth2 support.
Jan Tattermusch's avatar
Jan Tattermusch committed
- Grpc.Core:
  The main gRPC C# library.
Jan Tattermusch's avatar
Jan Tattermusch committed
- Grpc.Examples:
  API examples for math.proto
- Grpc.Examples.MathClient:
Jan Tattermusch's avatar
Jan Tattermusch committed
  An example client that sends some requests to math server.
Jan Tattermusch's avatar
Jan Tattermusch committed
- Grpc.Examples.MathServer:
  An example client that sends some requests to math server.
Jan Tattermusch's avatar
Jan Tattermusch committed
- Grpc.IntegrationTesting:
Jan Tattermusch's avatar
Jan Tattermusch committed
  Cross-language gRPC implementation testing (interop testing).

Troubleshooting
---------------

### Problem: Unable to load DLL 'grpc_csharp_ext.dll'

Internally, gRPC C# uses a native library written in C (gRPC C core) and invokes its functionality via P/Invoke. `grpc_csharp_ext` library is a native extension library that facilitates this by wrapping some C core API into a form that's more digestible for P/Invoke. If you get the above error, it means that the native dependencies could not be located by the C# runtime (or they are incompatible with the current runtime, so they could not be loaded). The solution to this is environment specific.

- If you are developing on Windows in Visual Studio, the `grpc_csharp_ext.dll` that is shipped by gRPC nuget packages should be automatically copied to your build destination folder once you build. By adjusting project properties in your VS project file, you can influence which exact configuration of `grpc_csharp_ext.dll` will be used (based on VS version, bitness, debug/release configuration).

- If you are running your application that is using gRPC on Windows machine that doesn't have Visual Studio installed, you might need to install [Visual C++ 2013 redistributable](https://www.microsoft.com/en-us/download/details.aspx?id=40784) that contains some system .dll libraries that `grpc_csharp_ext.dll` depends on (see #905 for more details).

- On Linux (or Docker), you need to first install gRPC C core and `libgrpc_csharp_ext.so` shared libraries. Currently, the libraries can be installed by `make install_grpc_csharp_ext` or using Linuxbrew (a Debian package is coming soon). Installation on a machine where your application is going to be deployed is no different. 

- On Mac, you need to first install gRPC C core and `libgrpc_csharp_ext.dylib` shared libraries using Homebrew. See above for installation instruction. Installation on a machine where your application is going to be deployed is no different. 

- Possible cause for the problem is that the `grpc_csharp_ext` library is installed, but it has different bitness (32/64bit) than your C# runtime (in case you are using mono) or C# application.