---
title:  .NET Application Development Walkthrough
---

This section describes how to set up a .NET native client development environment using C# and CMake.

## <a id="prerequisites_dotnet"></a>Prerequisites
This walkthrough assumes that certain components are in place:

- The **<%=vars.product_name%> Native Client libraries**. Install the Native Client as described in
  [Getting Started with the Native Client](getting-started-nc-client.html). Follow the ease-of-use
  recommendations by installing the Native Client in `C:\Program Files\nativeclient`.

- The **CMake** tool suite. Download and install CMake, following the instructions on [cmake.org] (https://cmake.org).

- **Geode**: Install and configure Geode. See the [_Geode User's Guide_](http://geode.apache.org/docs/) for instructions and system requirements.

- **Visual Studio 2015** or higher and **.NET 4.5.2**.

To develop a Native Client application using .NET and CMake:

  - Create a project directory structure
  - Populate the project directories with C# source code
  - Configure the CMake build environment
  - Run CMake to configure your application
  - Build and run your application using Visual Studio

## <a id="setting_up_dirs_dotnet"></a>Setting up Directories and Sources

1. Create a project directory structure. In this example, the project is called MyProject. The
directory structure provides a place for your application source files and a `cmake` modules
directory for project-specific CMake files:

    ```
    MyProject\
      cmake\
        Find<%=vars.product_name%>Native.cmake
      CMakeLists.txt
      Program.cs
    ```

1. Change directory to MyProject and create your application sources. In this example, we have one
source file, `Program.cs`.

## <a id="configuring_cmake_dotnet"></a>Configuring CMake

1. Copy the `Find<%=vars.product_name%>Native.cmake` script from one of the Native Client examples to the `cmake` subdirectory.

1. Create CMakeLists.txt. Copy the file from an example, if you like, as a starting point. The CMakeLists.txt file
should contain the following CMake instructions:

  - CMake minimum version

    ```
    cmake_minimum_required(VERSION 3.10)
    ```

  - Your project name and language

    ```
    project(MyProject LANGUAGES CSharp)
    ```

  - Path to the CMake modules directory where the `Find<%=vars.product_name%>Native.cmake` script is located and an instruction
    telling CMake to use it:

    ```
    set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
    find_package(<%=vars.product_name%>Native REQUIRED COMPONENTS dotnet)
    ```

  - The compilation target and the source(s) to be compiled

    ```
    add_executable(MyProject Program.cs)

    target_link_libraries(MyProject
      PUBLIC
        <%=vars.product_name%>Native::dotnet)

    set_target_properties(MyProject PROPERTIES
        VS_DOTNET_TARGET_FRAMEWORK_VERSION "v4.5.2"
        VS_DOTNET_REFERENCES "System;${<%=vars.product_name%>Native_DOTNET_LIBRARY}")
    ```

Combined, the above elements comprise the following CMakeLists.txt:

```
# CMakeLists.txt for .NET Native Client App
cmake_minimum_required(VERSION 3.10)

project(MyProject LANGUAGES CSharp)

set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)

find_package(<%=vars.product_name%>Native REQUIRED COMPONENTS dotnet)

add_executable(MyProject Program.cs)

target_link_libraries(MyProject
  PUBLIC
    <%=vars.product_name%>Native::dotnet)

set_target_properties(MyProject PROPERTIES
    VS_DOTNET_TARGET_FRAMEWORK_VERSION "v4.5.2"
    VS_DOTNET_REFERENCES "System;${<%=vars.product_name%>Native_DOTNET_LIBRARY}")
```

## <a id="building_the_app_dotnet"></a>Configuring the App

1. Create a build directory and set it as your current directory:

    ```
    $ mkdir build
    $ cd build
    ```

1. Run CMake to configure the build:

    ```
    $ cmake ..
    ```

This creates a Visual Studio solution for your .NET application. For example, `MyProject.sln`.

## <a id="building_and_running_dotnet"></a>Building and Running the App

Open the solution file in Visual Studio and build the project.


