diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml
index 546c0431..1dab9d3f 100644
--- a/.github/workflows/cicd.yml
+++ b/.github/workflows/cicd.yml
@@ -33,3 +33,12 @@ jobs:
build-types: "[ 'Debug' ]"
test: true
preset-name: 'cicd'
+
+ dotnet-tests:
+ name: .NET Tests
+ permissions:
+ contents: read
+ concurrency:
+ group: ${{ github.workflow }}-dotnet-${{ github.event.pull_request.number || github.ref }}
+ cancel-in-progress: true
+ uses: ./.github/workflows/dotnet-tests.yml
diff --git a/.github/workflows/dotnet-tests.yml b/.github/workflows/dotnet-tests.yml
new file mode 100644
index 00000000..69ec1dd5
--- /dev/null
+++ b/.github/workflows/dotnet-tests.yml
@@ -0,0 +1,97 @@
+name: '.NET Tests 🧪'
+
+on:
+ workflow_dispatch:
+ workflow_call:
+ push:
+ branches:
+ - develop
+ - main
+ paths:
+ - 'api/dotnet/**'
+ - 'api/protos/**'
+ - 'tests/integration/dotnet/**'
+ - '.github/workflows/dotnet-tests.yml'
+ pull_request:
+ branches:
+ - develop
+ - main
+ paths:
+ - 'api/dotnet/**'
+ - 'api/protos/**'
+ - 'tests/integration/dotnet/**'
+ - '.github/workflows/dotnet-tests.yml'
+
+jobs:
+ dotnet-build:
+ name: Build .NET API Bindings
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: '8.0.x'
+
+ - name: Restore dependencies
+ run: dotnet restore api/dotnet/NetRemoteClient.csproj
+
+ - name: Build
+ run: dotnet build api/dotnet/NetRemoteClient.csproj --configuration Release --no-restore
+
+ - name: Pack NuGet package
+ run: dotnet pack api/dotnet/NetRemoteClient.csproj --configuration Release --no-build --output ./artifacts
+
+ - name: Upload NuGet package artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: nuget-package
+ path: ./artifacts/*.nupkg
+ retention-days: 7
+
+ dotnet-integration-tests:
+ name: .NET Integration Tests
+ runs-on: ubuntu-latest
+ needs: dotnet-build
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: '8.0.x'
+
+ - name: Restore dependencies
+ run: dotnet restore tests/integration/dotnet/NetRemoteClient.IntegrationTests.csproj
+
+ - name: Build
+ run: dotnet build tests/integration/dotnet/NetRemoteClient.IntegrationTests.csproj --configuration Release --no-restore
+
+ - name: Run integration tests
+ run: dotnet test tests/integration/dotnet/NetRemoteClient.IntegrationTests.csproj --configuration Release --no-build --verbosity normal --logger "trx;LogFileName=test-results.trx"
+
+ - name: Upload test results
+ uses: actions/upload-artifact@v4
+ if: always()
+ with:
+ name: dotnet-test-results
+ path: tests/integration/dotnet/TestResults/*.trx
+ retention-days: 7
+
+ dotnet-tests-windows:
+ name: .NET Tests (Windows)
+ runs-on: windows-latest
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: '8.0.x'
+
+ - name: Build and test
+ run: dotnet test tests/integration/dotnet/NetRemoteClient.IntegrationTests.csproj --configuration Release --verbosity normal
diff --git a/api/CMakeLists.txt b/api/CMakeLists.txt
index 543bf2b1..b7e504c6 100644
--- a/api/CMakeLists.txt
+++ b/api/CMakeLists.txt
@@ -26,3 +26,6 @@ install(
if (NOT NETREMOTE_EXCLUDE_API_BINDINGS)
add_subdirectory(protocol)
endif()
+
+# .NET API bindings (NuGet package)
+add_subdirectory(dotnet)
diff --git a/api/dotnet/.gitignore b/api/dotnet/.gitignore
new file mode 100644
index 00000000..bcfe10ee
--- /dev/null
+++ b/api/dotnet/.gitignore
@@ -0,0 +1,7 @@
+# Build outputs
+bin/
+obj/
+
+# IDE
+.vs/
+*.user
diff --git a/api/dotnet/CMakeLists.txt b/api/dotnet/CMakeLists.txt
new file mode 100644
index 00000000..aece5d59
--- /dev/null
+++ b/api/dotnet/CMakeLists.txt
@@ -0,0 +1,65 @@
+# CMake integration for NuGet package building
+# This file provides targets for building and packing the NetRemote client NuGet package
+
+find_program(DOTNET_EXECUTABLE dotnet)
+
+if(NOT DOTNET_EXECUTABLE)
+ message(WARNING "dotnet CLI not found. NuGet package targets will not be available.")
+ return()
+endif()
+
+set(NUGET_PROJECT_FILE "${CMAKE_CURRENT_SOURCE_DIR}/NetRemoteClient.csproj")
+set(NUGET_OUTPUT_DIR "${CMAKE_SOURCE_DIR}/out/nuget")
+
+# Update the version in the .csproj file based on the project version
+set(NUGET_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
+
+# Custom target to restore NuGet package dependencies
+add_custom_target(nuget-restore
+ COMMAND ${DOTNET_EXECUTABLE} restore "${NUGET_PROJECT_FILE}"
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ COMMENT "Restoring NuGet package dependencies..."
+ VERBATIM
+)
+
+# Custom target to build the NuGet package project
+add_custom_target(nuget-build
+ COMMAND ${DOTNET_EXECUTABLE} build "${NUGET_PROJECT_FILE}" -c Release
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ DEPENDS nuget-restore
+ COMMENT "Building NetRemote client library..."
+ VERBATIM
+)
+
+# Custom target to create the NuGet package
+add_custom_target(nuget-pack
+ COMMAND ${DOTNET_EXECUTABLE} pack "${NUGET_PROJECT_FILE}"
+ -c Release
+ -o "${NUGET_OUTPUT_DIR}"
+ -p:Version=${NUGET_VERSION}
+ --no-build
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ DEPENDS nuget-build
+ COMMENT "Creating NuGet package Microsoft.Net.Remote.Client ${NUGET_VERSION}..."
+ VERBATIM
+)
+
+# Custom target to clean NuGet build artifacts
+add_custom_target(nuget-clean
+ COMMAND ${DOTNET_EXECUTABLE} clean "${NUGET_PROJECT_FILE}" -c Release
+ COMMAND ${CMAKE_COMMAND} -E rm -rf "${CMAKE_CURRENT_SOURCE_DIR}/bin"
+ COMMAND ${CMAKE_COMMAND} -E rm -rf "${CMAKE_CURRENT_SOURCE_DIR}/obj"
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ COMMENT "Cleaning NuGet build artifacts..."
+ VERBATIM
+)
+
+# Add a convenience target that does everything
+add_custom_target(nuget ALL
+ DEPENDS nuget-pack
+ COMMENT "NuGet package build complete"
+)
+
+message(STATUS "NuGet packaging enabled. Use 'cmake --build . --target nuget-pack' to create the package.")
+message(STATUS "NuGet package version: ${NUGET_VERSION}")
+message(STATUS "NuGet output directory: ${NUGET_OUTPUT_DIR}")
diff --git a/api/dotnet/NetRemoteClient.csproj b/api/dotnet/NetRemoteClient.csproj
new file mode 100644
index 00000000..baf01b13
--- /dev/null
+++ b/api/dotnet/NetRemoteClient.csproj
@@ -0,0 +1,100 @@
+
+
+
+ netstandard2.1
+ latest
+
+
+ Microsoft.Net.Remote.Client
+ 0.5.2
+ Microsoft
+ Microsoft
+ NetRemote
+ NetRemote client library providing gRPC service bindings and protobuf definitions for remote network management operations.
+ netremote;grpc;protobuf;network;wifi;remote
+ https://github.com/microsoft/netremote
+ https://github.com/microsoft/netremote
+ git
+ MIT
+ README.md
+ Copyright (c) Microsoft Corporation. All rights reserved.
+
+
+ false
+ true
+ snupkg
+ true
+
+
+ $(MSBuildThisFileDirectory)../../out/nuget
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+ Protos/NetworkCore.proto
+
+
+ Protos/Network8021x.proto
+
+
+ Protos/WifiCore.proto
+
+
+ Protos/NetRemoteDataStream.proto
+
+
+ Protos/NetRemoteDataStreamingService.proto
+
+
+ Protos/NetRemoteNetwork.proto
+
+
+ Protos/NetRemoteRfAttenuator.proto
+
+
+ Protos/NetRemoteRfAttenuatorService.proto
+
+
+ Protos/NetRemoteService.proto
+
+
+ Protos/NetRemoteWifi.proto
+
+
+
+
+
+
+
+
+
+
diff --git a/api/dotnet/README.md b/api/dotnet/README.md
new file mode 100644
index 00000000..77471a1d
--- /dev/null
+++ b/api/dotnet/README.md
@@ -0,0 +1,73 @@
+# Microsoft.Net.Remote.Client
+
+A .NET client library for NetRemote, providing gRPC service bindings and Protocol Buffer definitions for remote network management operations.
+
+## Overview
+
+This package provides:
+
+- **gRPC Client Stubs**: Pre-generated client stubs for all NetRemote services
+- **Protocol Buffer Definitions**: Message types for network, Wi-Fi, and RF attenuator operations
+- **Proto Files**: Raw `.proto` files included for use with other languages or custom code generation
+
+## Installation
+
+```bash
+dotnet add package Microsoft.Net.Remote.Client
+```
+
+## Quick Start
+
+```csharp
+using Grpc.Net.Client;
+using Microsoft.Net.Remote.Service;
+
+// Create a channel to the NetRemote server
+using var channel = GrpcChannel.ForAddress("http://localhost:5047");
+
+// Create the client
+var client = new NetRemote.NetRemoteClient(channel);
+
+// Enumerate network interfaces
+var response = await client.NetworkInterfacesEnumerateAsync(
+ new Microsoft.Net.Remote.Network.NetworkEnumerateInterfacesRequest());
+
+foreach (var iface in response.Interfaces)
+{
+ Console.WriteLine($"Interface: {iface.Id} ({iface.Kind})");
+}
+```
+
+## Services
+
+The package includes clients for the following services:
+
+### NetRemote Service
+Core network management operations including:
+- Network interface enumeration
+- Wi-Fi access point management (enable/disable, configuration)
+- Wi-Fi authentication settings (including 802.1X)
+
+### NetRemote Data Streaming Service
+Real-time data streaming capabilities for network monitoring and diagnostics.
+
+### NetRemote RF Attenuator Service
+RF attenuator control for wireless testing scenarios.
+
+## Proto Files
+
+The raw `.proto` files are included in the package under the `Protos` content folder. These can be used to generate bindings for other languages or for custom code generation scenarios.
+
+## Requirements
+
+- .NET Core 3.0+ / .NET 5+ / .NET Standard 2.1 compatible runtime
+- A running NetRemote server instance
+
+## License
+
+This project is licensed under the MIT License - see the [LICENSE](https://github.com/microsoft/netremote/blob/develop/LICENSE) file for details.
+
+## Links
+
+- [GitHub Repository](https://github.com/microsoft/netremote)
+- [Documentation](https://github.com/microsoft/netremote#readme)
diff --git a/api/dotnet/build.ps1 b/api/dotnet/build.ps1
new file mode 100644
index 00000000..59927024
--- /dev/null
+++ b/api/dotnet/build.ps1
@@ -0,0 +1,141 @@
+<#
+.SYNOPSIS
+ Build script for NetRemote NuGet package (Windows)
+
+.DESCRIPTION
+ This script builds and packs the Microsoft.Net.Remote.Client NuGet package
+
+.PARAMETER Configuration
+ Build configuration (Debug or Release). Default: Release
+
+.PARAMETER Version
+ Package version (e.g., 1.0.0). If not specified, determined from git tag or defaults to 0.5.2
+
+.PARAMETER OutputDir
+ Output directory for the NuGet package
+
+.PARAMETER SkipRestore
+ Skip package restore
+
+.PARAMETER SkipBuild
+ Skip build (pack only)
+
+.PARAMETER Clean
+ Clean build artifacts before building
+
+.EXAMPLE
+ .\build.ps1 -Configuration Release -Version 1.0.0
+
+.EXAMPLE
+ .\build.ps1 -Clean
+#>
+
+param(
+ [ValidateSet("Debug", "Release")]
+ [string]$Configuration = "Release",
+
+ [string]$Version = "",
+
+ [string]$OutputDir = "",
+
+ [switch]$SkipRestore,
+
+ [switch]$SkipBuild,
+
+ [switch]$Clean
+)
+
+$ErrorActionPreference = "Stop"
+
+$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
+$ProjectRoot = (Get-Item "$ScriptDir\..\..").FullName
+
+if ([string]::IsNullOrEmpty($OutputDir)) {
+ $OutputDir = Join-Path $ProjectRoot "out\nuget"
+}
+
+# Check for dotnet CLI
+$dotnetCmd = Get-Command dotnet -ErrorAction SilentlyContinue
+if (-not $dotnetCmd) {
+ Write-Error "dotnet CLI not found. Please install .NET SDK from https://dotnet.microsoft.com/download"
+ exit 1
+}
+
+Write-Host "=== NetRemote NuGet Package Build ===" -ForegroundColor Cyan
+Write-Host "Configuration: $Configuration"
+Write-Host "Output: $OutputDir"
+
+# Determine version if not specified
+if ([string]::IsNullOrEmpty($Version)) {
+ # Try to get version from git tag
+ $gitCmd = Get-Command git -ErrorAction SilentlyContinue
+ if ($gitCmd -and (Test-Path (Join-Path $ProjectRoot ".git"))) {
+ $latestTag = git -C $ProjectRoot tag -l --sort=-v:refname | Select-Object -First 1
+ if ($latestTag -match '^v(\d+)\.(\d+)\.(\d+)') {
+ $Version = "$($Matches[1]).$($Matches[2]).$($Matches[3])"
+ }
+ }
+
+ # Fallback to default version
+ if ([string]::IsNullOrEmpty($Version)) {
+ $Version = "0.5.2"
+ }
+}
+
+Write-Host "Version: $Version"
+
+Push-Location $ScriptDir
+
+try {
+ # Clean if requested
+ if ($Clean) {
+ Write-Host ""
+ Write-Host "Cleaning build artifacts..." -ForegroundColor Yellow
+ dotnet clean NetRemoteClient.csproj -c $Configuration 2>$null
+ if (Test-Path "bin") { Remove-Item -Recurse -Force "bin" }
+ if (Test-Path "obj") { Remove-Item -Recurse -Force "obj" }
+ }
+
+ # Restore packages
+ if (-not $SkipRestore) {
+ Write-Host ""
+ Write-Host "Restoring packages..." -ForegroundColor Yellow
+ dotnet restore NetRemoteClient.csproj
+ if ($LASTEXITCODE -ne 0) { throw "Restore failed" }
+ }
+
+ # Build
+ if (-not $SkipBuild) {
+ Write-Host ""
+ Write-Host "Building..." -ForegroundColor Yellow
+ dotnet build NetRemoteClient.csproj -c $Configuration --no-restore
+ if ($LASTEXITCODE -ne 0) { throw "Build failed" }
+ }
+
+ # Create output directory
+ if (-not (Test-Path $OutputDir)) {
+ New-Item -ItemType Directory -Path $OutputDir -Force | Out-Null
+ }
+
+ # Pack
+ Write-Host ""
+ Write-Host "Creating NuGet package..." -ForegroundColor Yellow
+ dotnet pack NetRemoteClient.csproj `
+ -c $Configuration `
+ -o $OutputDir `
+ -p:Version=$Version `
+ --no-build
+
+ if ($LASTEXITCODE -ne 0) { throw "Pack failed" }
+
+ Write-Host ""
+ Write-Host "=== Build Complete ===" -ForegroundColor Green
+ Write-Host "NuGet package created at: $OutputDir"
+
+ Get-ChildItem -Path $OutputDir -Filter "*.nupkg" | ForEach-Object {
+ Write-Host " - $($_.Name)" -ForegroundColor Cyan
+ }
+}
+finally {
+ Pop-Location
+}
diff --git a/api/dotnet/build.sh b/api/dotnet/build.sh
new file mode 100755
index 00000000..15ea41b6
--- /dev/null
+++ b/api/dotnet/build.sh
@@ -0,0 +1,133 @@
+#!/bin/bash
+# Build script for NetRemote NuGet package (Linux/macOS)
+# This script builds and packs the Microsoft.Net.Remote.Client NuGet package
+
+set -e
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
+OUTPUT_DIR="${PROJECT_ROOT}/out/nuget"
+
+# Default values
+CONFIGURATION="Release"
+VERSION=""
+SKIP_RESTORE=false
+SKIP_BUILD=false
+CLEAN=false
+
+# Parse command line arguments
+while [[ $# -gt 0 ]]; do
+ case $1 in
+ -c|--configuration)
+ CONFIGURATION="$2"
+ shift 2
+ ;;
+ -v|--version)
+ VERSION="$2"
+ shift 2
+ ;;
+ -o|--output)
+ OUTPUT_DIR="$2"
+ shift 2
+ ;;
+ --skip-restore)
+ SKIP_RESTORE=true
+ shift
+ ;;
+ --skip-build)
+ SKIP_BUILD=true
+ shift
+ ;;
+ --clean)
+ CLEAN=true
+ shift
+ ;;
+ -h|--help)
+ echo "Usage: $0 [options]"
+ echo ""
+ echo "Options:"
+ echo " -c, --configuration Build configuration (Debug|Release). Default: Release"
+ echo " -v, --version Package version (e.g., 1.0.0). Default: from git tag or 0.5.2"
+ echo " -o, --output Output directory for the NuGet package"
+ echo " --skip-restore Skip package restore"
+ echo " --skip-build Skip build (pack only)"
+ echo " --clean Clean build artifacts before building"
+ echo " -h, --help Show this help message"
+ exit 0
+ ;;
+ *)
+ echo "Unknown option: $1"
+ exit 1
+ ;;
+ esac
+done
+
+# Check for dotnet CLI
+if ! command -v dotnet &> /dev/null; then
+ echo "Error: dotnet CLI not found. Please install .NET SDK."
+ echo "Visit: https://dotnet.microsoft.com/download"
+ exit 1
+fi
+
+echo "=== NetRemote NuGet Package Build ==="
+echo "Configuration: $CONFIGURATION"
+echo "Output: $OUTPUT_DIR"
+
+# Determine version if not specified
+if [ -z "$VERSION" ]; then
+ # Try to get version from git tag
+ if command -v git &> /dev/null && [ -d "$PROJECT_ROOT/.git" ]; then
+ LATEST_TAG=$(git -C "$PROJECT_ROOT" tag -l --sort=-v:refname | head -n1)
+ if [[ "$LATEST_TAG" =~ ^v([0-9]+)\.([0-9]+)\.([0-9]+) ]]; then
+ VERSION="${BASH_REMATCH[1]}.${BASH_REMATCH[2]}.${BASH_REMATCH[3]}"
+ fi
+ fi
+
+ # Fallback to default version
+ if [ -z "$VERSION" ]; then
+ VERSION="0.5.2"
+ fi
+fi
+
+echo "Version: $VERSION"
+
+cd "$SCRIPT_DIR"
+
+# Clean if requested
+if [ "$CLEAN" = true ]; then
+ echo ""
+ echo "Cleaning build artifacts..."
+ dotnet clean NetRemoteClient.csproj -c "$CONFIGURATION" || true
+ rm -rf bin obj
+fi
+
+# Restore packages
+if [ "$SKIP_RESTORE" = false ]; then
+ echo ""
+ echo "Restoring packages..."
+ dotnet restore NetRemoteClient.csproj
+fi
+
+# Build
+if [ "$SKIP_BUILD" = false ]; then
+ echo ""
+ echo "Building..."
+ dotnet build NetRemoteClient.csproj -c "$CONFIGURATION" --no-restore
+fi
+
+# Create output directory
+mkdir -p "$OUTPUT_DIR"
+
+# Pack
+echo ""
+echo "Creating NuGet package..."
+dotnet pack NetRemoteClient.csproj \
+ -c "$CONFIGURATION" \
+ -o "$OUTPUT_DIR" \
+ -p:Version="$VERSION" \
+ --no-build
+
+echo ""
+echo "=== Build Complete ==="
+echo "NuGet package created at: $OUTPUT_DIR"
+ls -la "$OUTPUT_DIR"/*.nupkg 2>/dev/null || echo "No .nupkg files found"
diff --git a/src/common/dotnet/CMakeLists.txt b/src/common/dotnet/CMakeLists.txt
deleted file mode 100644
index 3ca90d6c..00000000
--- a/src/common/dotnet/CMakeLists.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-
-include_external_msproject(${PROJECT_NAME}-dotnet
- ${CMAKE_CURRENT_LIST_DIR}/NetRemote.sln
-)
diff --git a/src/common/dotnet/NetRemote.sln b/src/common/dotnet/NetRemote.sln
deleted file mode 100644
index 50960c12..00000000
--- a/src/common/dotnet/NetRemote.sln
+++ /dev/null
@@ -1,93 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 17
-VisualStudioVersion = 17.0.31903.59
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NetRemoteService", "NetRemoteService\NetRemoteService.csproj", "{D56170AB-FFA2-435C-8B46-C1517D0873A3}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NetRemoteClient", "NetRemoteClient\NetRemoteClient.csproj", "{E4BB11EC-6CE2-4CE9-8806-EA9CF46DE658}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NetRemoteClientUnitTest", "NetRemoteClientUnitTest\NetRemoteClientUnitTest.csproj", "{452E5C5E-B769-43FE-AB74-5BD92D6E5BC9}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Debug|ARM32 = Debug|ARM32
- Debug|ARM64 = Debug|ARM64
- Debug|x64 = Debug|x64
- Debug|x86 = Debug|x86
- Release|Any CPU = Release|Any CPU
- Release|ARM32 = Release|ARM32
- Release|ARM64 = Release|ARM64
- Release|x64 = Release|x64
- Release|x86 = Release|x86
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {D56170AB-FFA2-435C-8B46-C1517D0873A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {D56170AB-FFA2-435C-8B46-C1517D0873A3}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {D56170AB-FFA2-435C-8B46-C1517D0873A3}.Debug|ARM32.ActiveCfg = Debug|ARM32
- {D56170AB-FFA2-435C-8B46-C1517D0873A3}.Debug|ARM32.Build.0 = Debug|ARM32
- {D56170AB-FFA2-435C-8B46-C1517D0873A3}.Debug|ARM64.ActiveCfg = Debug|ARM64
- {D56170AB-FFA2-435C-8B46-C1517D0873A3}.Debug|ARM64.Build.0 = Debug|ARM64
- {D56170AB-FFA2-435C-8B46-C1517D0873A3}.Debug|x64.ActiveCfg = Debug|x64
- {D56170AB-FFA2-435C-8B46-C1517D0873A3}.Debug|x64.Build.0 = Debug|x64
- {D56170AB-FFA2-435C-8B46-C1517D0873A3}.Debug|x86.ActiveCfg = Debug|x86
- {D56170AB-FFA2-435C-8B46-C1517D0873A3}.Debug|x86.Build.0 = Debug|x86
- {D56170AB-FFA2-435C-8B46-C1517D0873A3}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {D56170AB-FFA2-435C-8B46-C1517D0873A3}.Release|Any CPU.Build.0 = Release|Any CPU
- {D56170AB-FFA2-435C-8B46-C1517D0873A3}.Release|ARM32.ActiveCfg = Release|ARM32
- {D56170AB-FFA2-435C-8B46-C1517D0873A3}.Release|ARM32.Build.0 = Release|ARM32
- {D56170AB-FFA2-435C-8B46-C1517D0873A3}.Release|ARM64.ActiveCfg = Release|ARM64
- {D56170AB-FFA2-435C-8B46-C1517D0873A3}.Release|ARM64.Build.0 = Release|ARM64
- {D56170AB-FFA2-435C-8B46-C1517D0873A3}.Release|x64.ActiveCfg = Release|Any CPU
- {D56170AB-FFA2-435C-8B46-C1517D0873A3}.Release|x64.Build.0 = Release|Any CPU
- {D56170AB-FFA2-435C-8B46-C1517D0873A3}.Release|x86.ActiveCfg = Release|x86
- {D56170AB-FFA2-435C-8B46-C1517D0873A3}.Release|x86.Build.0 = Release|x86
- {E4BB11EC-6CE2-4CE9-8806-EA9CF46DE658}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E4BB11EC-6CE2-4CE9-8806-EA9CF46DE658}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E4BB11EC-6CE2-4CE9-8806-EA9CF46DE658}.Debug|ARM32.ActiveCfg = Debug|ARM32
- {E4BB11EC-6CE2-4CE9-8806-EA9CF46DE658}.Debug|ARM32.Build.0 = Debug|ARM32
- {E4BB11EC-6CE2-4CE9-8806-EA9CF46DE658}.Debug|ARM64.ActiveCfg = Debug|ARM64
- {E4BB11EC-6CE2-4CE9-8806-EA9CF46DE658}.Debug|ARM64.Build.0 = Debug|ARM64
- {E4BB11EC-6CE2-4CE9-8806-EA9CF46DE658}.Debug|x64.ActiveCfg = Debug|x64
- {E4BB11EC-6CE2-4CE9-8806-EA9CF46DE658}.Debug|x64.Build.0 = Debug|x64
- {E4BB11EC-6CE2-4CE9-8806-EA9CF46DE658}.Debug|x86.ActiveCfg = Debug|x86
- {E4BB11EC-6CE2-4CE9-8806-EA9CF46DE658}.Debug|x86.Build.0 = Debug|x86
- {E4BB11EC-6CE2-4CE9-8806-EA9CF46DE658}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E4BB11EC-6CE2-4CE9-8806-EA9CF46DE658}.Release|Any CPU.Build.0 = Release|Any CPU
- {E4BB11EC-6CE2-4CE9-8806-EA9CF46DE658}.Release|ARM32.ActiveCfg = Release|ARM32
- {E4BB11EC-6CE2-4CE9-8806-EA9CF46DE658}.Release|ARM32.Build.0 = Release|ARM32
- {E4BB11EC-6CE2-4CE9-8806-EA9CF46DE658}.Release|ARM64.ActiveCfg = Release|ARM64
- {E4BB11EC-6CE2-4CE9-8806-EA9CF46DE658}.Release|ARM64.Build.0 = Release|ARM64
- {E4BB11EC-6CE2-4CE9-8806-EA9CF46DE658}.Release|x64.ActiveCfg = Release|x64
- {E4BB11EC-6CE2-4CE9-8806-EA9CF46DE658}.Release|x64.Build.0 = Release|x64
- {E4BB11EC-6CE2-4CE9-8806-EA9CF46DE658}.Release|x86.ActiveCfg = Release|x86
- {E4BB11EC-6CE2-4CE9-8806-EA9CF46DE658}.Release|x86.Build.0 = Release|x86
- {452E5C5E-B769-43FE-AB74-5BD92D6E5BC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {452E5C5E-B769-43FE-AB74-5BD92D6E5BC9}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {452E5C5E-B769-43FE-AB74-5BD92D6E5BC9}.Debug|ARM32.ActiveCfg = Debug|ARM32
- {452E5C5E-B769-43FE-AB74-5BD92D6E5BC9}.Debug|ARM32.Build.0 = Debug|ARM32
- {452E5C5E-B769-43FE-AB74-5BD92D6E5BC9}.Debug|ARM64.ActiveCfg = Debug|ARM64
- {452E5C5E-B769-43FE-AB74-5BD92D6E5BC9}.Debug|ARM64.Build.0 = Debug|ARM64
- {452E5C5E-B769-43FE-AB74-5BD92D6E5BC9}.Debug|x64.ActiveCfg = Debug|x64
- {452E5C5E-B769-43FE-AB74-5BD92D6E5BC9}.Debug|x64.Build.0 = Debug|x64
- {452E5C5E-B769-43FE-AB74-5BD92D6E5BC9}.Debug|x86.ActiveCfg = Debug|x86
- {452E5C5E-B769-43FE-AB74-5BD92D6E5BC9}.Debug|x86.Build.0 = Debug|x86
- {452E5C5E-B769-43FE-AB74-5BD92D6E5BC9}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {452E5C5E-B769-43FE-AB74-5BD92D6E5BC9}.Release|Any CPU.Build.0 = Release|Any CPU
- {452E5C5E-B769-43FE-AB74-5BD92D6E5BC9}.Release|ARM32.ActiveCfg = Release|ARM32
- {452E5C5E-B769-43FE-AB74-5BD92D6E5BC9}.Release|ARM32.Build.0 = Release|ARM32
- {452E5C5E-B769-43FE-AB74-5BD92D6E5BC9}.Release|ARM64.ActiveCfg = Release|ARM64
- {452E5C5E-B769-43FE-AB74-5BD92D6E5BC9}.Release|ARM64.Build.0 = Release|ARM64
- {452E5C5E-B769-43FE-AB74-5BD92D6E5BC9}.Release|x64.ActiveCfg = Release|Any CPU
- {452E5C5E-B769-43FE-AB74-5BD92D6E5BC9}.Release|x64.Build.0 = Release|Any CPU
- {452E5C5E-B769-43FE-AB74-5BD92D6E5BC9}.Release|x86.ActiveCfg = Release|x86
- {452E5C5E-B769-43FE-AB74-5BD92D6E5BC9}.Release|x86.Build.0 = Release|x86
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {4F4EC49D-9867-45B8-9505-3F87F7773AAE}
- EndGlobalSection
-EndGlobal
diff --git a/src/common/dotnet/NetRemoteClient/NetRemoteClient.cs b/src/common/dotnet/NetRemoteClient/NetRemoteClient.cs
deleted file mode 100644
index a1e08d27..00000000
--- a/src/common/dotnet/NetRemoteClient/NetRemoteClient.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-
-namespace Microsoft.Net.Remote.Client
-{
- public class NetRemoteClient
- {
-
- }
-}
diff --git a/src/common/dotnet/NetRemoteClient/NetRemoteClient.csproj b/src/common/dotnet/NetRemoteClient/NetRemoteClient.csproj
deleted file mode 100644
index 581d29ef..00000000
--- a/src/common/dotnet/NetRemoteClient/NetRemoteClient.csproj
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
-
- net7.0
- enable
- enable
- AnyCPU;x64;ARM64;ARM32;x86
-
-
-
-
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
-
-
-
-
-
-
-
- Protos\NetRemoteDataStream.proto
-
-
- Protos\NetRemoteDataStreamingService.proto
-
-
- Protos\NetRemoteNetwork.proto
-
-
- Protos\NetRemoteService.proto
-
-
- Protos\NetRemoteWifi.proto
-
-
- Protos\Network8021x.proto
-
-
- Protos\NetworkCore.proto
-
-
- Protos\WifiCore.proto
-
-
-
-
diff --git a/src/common/dotnet/NetRemoteService/NetRemoteService.csproj b/src/common/dotnet/NetRemoteService/NetRemoteService.csproj
deleted file mode 100644
index be6b1136..00000000
--- a/src/common/dotnet/NetRemoteService/NetRemoteService.csproj
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
- net7.0
- enable
- enable
- AnyCPU;x64;ARM64;ARM32;x86
-
-
-
-
-
-
-
-
-
-
-
-
- Protos\NetRemoteDataStream.proto
-
-
- Protos\NetRemoteDataStreamingService.proto
-
-
- Protos\NetRemoteNetwork.proto
-
-
- Protos\NetRemoteService.proto
-
-
- Protos\NetRemoteWifi.proto
-
-
- Protos\Network8021x.proto
-
-
- Protos\NetworkCore.proto
-
-
- Protos\WifiCore.proto
-
-
-
-
diff --git a/src/common/dotnet/NetRemoteService/NetRemoteService.csproj.user b/src/common/dotnet/NetRemoteService/NetRemoteService.csproj.user
deleted file mode 100644
index 0c93fe21..00000000
--- a/src/common/dotnet/NetRemoteService/NetRemoteService.csproj.user
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
- http
-
-
- ProjectDebugger
-
-
\ No newline at end of file
diff --git a/src/common/dotnet/NetRemoteService/Program.cs b/src/common/dotnet/NetRemoteService/Program.cs
deleted file mode 100644
index 91c59a54..00000000
--- a/src/common/dotnet/NetRemoteService/Program.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-using Microsoft.Net.Remote.Service;
-
-var builder = WebApplication.CreateBuilder(args);
-
-// Add services to the container.
-builder.Services.AddGrpc();
-
-var app = builder.Build();
-
-// Configure the HTTP request pipeline.
-app.MapGrpcService();
-app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");
-
-app.Run();
diff --git a/src/common/dotnet/NetRemoteService/Properties/launchSettings.json b/src/common/dotnet/NetRemoteService/Properties/launchSettings.json
deleted file mode 100644
index 4a9f9107..00000000
--- a/src/common/dotnet/NetRemoteService/Properties/launchSettings.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "profiles": {
- "http": {
- "commandName": "Project",
- "dotnetRunMessages": true,
- "launchBrowser": false,
- "applicationUrl": "http://localhost:5047",
- "environmentVariables": {
- "ASPNETCORE_ENVIRONMENT": "Development"
- }
- },
- "https": {
- "commandName": "Project",
- "dotnetRunMessages": true,
- "launchBrowser": false,
- "applicationUrl": "https://localhost:7073;http://localhost:5047",
- "environmentVariables": {
- "ASPNETCORE_ENVIRONMENT": "Development"
- }
- }
- }
-}
diff --git a/src/common/dotnet/NetRemoteService/Services/NetRemoteService.cs b/src/common/dotnet/NetRemoteService/Services/NetRemoteService.cs
deleted file mode 100644
index be668d8d..00000000
--- a/src/common/dotnet/NetRemoteService/Services/NetRemoteService.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-
-using Grpc = global::Grpc.Core;
-
-namespace Microsoft.Net.Remote.Service
-{
- public class NetRemoteService : NetRemote.NetRemoteBase
- {
- private readonly ILogger _logger;
-
- public NetRemoteService(ILogger logger)
- {
- _logger = logger;
- }
- }
-}
diff --git a/src/common/dotnet/NetRemoteService/appsettings.Development.json b/src/common/dotnet/NetRemoteService/appsettings.Development.json
deleted file mode 100644
index ff66ba6b..00000000
--- a/src/common/dotnet/NetRemoteService/appsettings.Development.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "Logging": {
- "LogLevel": {
- "Default": "Information",
- "Microsoft.AspNetCore": "Warning"
- }
- }
-}
diff --git a/src/common/dotnet/NetRemoteService/appsettings.json b/src/common/dotnet/NetRemoteService/appsettings.json
deleted file mode 100644
index e559d3aa..00000000
--- a/src/common/dotnet/NetRemoteService/appsettings.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "Logging": {
- "LogLevel": {
- "Default": "Information",
- "Microsoft.AspNetCore": "Warning"
- }
- },
- "AllowedHosts": "*",
- "Kestrel": {
- "EndpointDefaults": {
- "Protocols": "Http2"
- }
- }
-}
diff --git a/src/common/dotnet/NetRemoteClientUnitTest/GlobalUsings.cs b/tests/integration/dotnet/GlobalUsings.cs
similarity index 100%
rename from src/common/dotnet/NetRemoteClientUnitTest/GlobalUsings.cs
rename to tests/integration/dotnet/GlobalUsings.cs
diff --git a/src/common/dotnet/NetRemoteClientUnitTest/NetRemoteClientUnitTest.csproj b/tests/integration/dotnet/NetRemoteClient.IntegrationTests.csproj
similarity index 74%
rename from src/common/dotnet/NetRemoteClientUnitTest/NetRemoteClientUnitTest.csproj
rename to tests/integration/dotnet/NetRemoteClient.IntegrationTests.csproj
index 9b289d19..bdbbcf18 100644
--- a/src/common/dotnet/NetRemoteClientUnitTest/NetRemoteClientUnitTest.csproj
+++ b/tests/integration/dotnet/NetRemoteClient.IntegrationTests.csproj
@@ -1,13 +1,13 @@
- net7.0
+ net8.0
enable
enable
false
true
- AnyCPU;x64;ARM64;ARM32;x86
+ AnyCPU;x64;ARM64
@@ -18,7 +18,7 @@
-
+
diff --git a/src/common/dotnet/NetRemoteClientUnitTest/UnitTestNetRemoteClient.cs b/tests/integration/dotnet/NetRemoteClientTests.cs
similarity index 60%
rename from src/common/dotnet/NetRemoteClientUnitTest/UnitTestNetRemoteClient.cs
rename to tests/integration/dotnet/NetRemoteClientTests.cs
index fed05cf3..4b2b47ce 100644
--- a/src/common/dotnet/NetRemoteClientUnitTest/UnitTestNetRemoteClient.cs
+++ b/tests/integration/dotnet/NetRemoteClientTests.cs
@@ -3,10 +3,10 @@
using Microsoft.Net.Remote.Wifi;
using Microsoft.Net.Remote.Service;
-namespace Microsoft.Net.Remote.Client.Test
+namespace Microsoft.Net.Remote.Client.IntegrationTests
{
[TestClass]
- public class UnitTestNetRemoteClient
+ public class NetRemoteClientTests
{
private static readonly string AddressHttp = "http://localhost:5047";
private static readonly string AddressHttps = "https://localhost:7073";
@@ -34,5 +34,22 @@ internal static GrpcConnection CreateConnection(ConnectionType connectionType)
return new GrpcConnection(channel, client);
}
+
+ [TestMethod]
+ public void CanCreateGrpcChannel()
+ {
+ // Verify that a gRPC channel can be created with the expected address
+ using var channel = GrpcChannel.ForAddress(AddressHttp);
+ Assert.IsNotNull(channel);
+ }
+
+ [TestMethod]
+ public void CanCreateNetRemoteClient()
+ {
+ // Verify that a NetRemote client can be instantiated
+ using var channel = GrpcChannel.ForAddress(AddressHttp);
+ var client = new NetRemote.NetRemoteClient(channel);
+ Assert.IsNotNull(client);
+ }
}
}