Browse Source

Upgrade to .NET 8 (#8523)

* Upgrade to .NET 8 and native Npgsql

* Main docker file upgraded to .NET 8

* Reverse odbc mariadb upgrade

* Reverse unix upgrade for mysql

* Downgrade odbc implementation to .NET 7

* Odbc upgrade to .NET 8; exclude mysql as connector does not work with .NET 8

* Upgrade to official .NET 8 release

* Correct package references

* Make the package reference more generic

* Remove unused files and simplify docker files

* Better framework keywords

---------

Co-authored-by: LLT21 <[email protected]>
Co-authored-by: Luc Lefever <[email protected]>
LLT21 1 year ago
parent
commit
9269b712a3

+ 3 - 5
frameworks/CSharp/appmpower/appmpower-ado-pg.dockerfile

@@ -1,15 +1,13 @@
-FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
+FROM mcr.microsoft.com/dotnet/sdk:8.0.100 AS build
 RUN apt-get update
 RUN apt-get update
 RUN apt-get -yqq install clang zlib1g-dev libkrb5-dev libtinfo5
 RUN apt-get -yqq install clang zlib1g-dev libkrb5-dev libtinfo5
 
 
 WORKDIR /app
 WORKDIR /app
 COPY src .
 COPY src .
-RUN mv ./appMpower.ado ./appMpower.csproj
-RUN dotnet publish -c Release -o out -r linux-x64
+RUN dotnet publish -c Release -o out /p:Driver=ado
 
 
 # Construct the actual image that will run
 # Construct the actual image that will run
-FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS runtime
-RUN apt-get update
+FROM mcr.microsoft.com/dotnet/aspnet:8.0.0 AS runtime
 
 
 WORKDIR /app
 WORKDIR /app
 COPY --from=build /app/out ./
 COPY --from=build /app/out ./

+ 0 - 62
frameworks/CSharp/appmpower/appmpower-odbc-my.dockerfile

@@ -1,62 +0,0 @@
-FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
-RUN apt-get update
-RUN apt-get -yqq install clang zlib1g-dev libkrb5-dev libtinfo5
-RUN apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
-   libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
-   xz-utils tk-dev libffi-dev liblzma-dev pgpool2 vim-tiny
-
-WORKDIR /odbc
-
-#RUN curl -L -o unixODBC-2.3.9.tar.gz ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.9.tar.gz
-RUN curl -L -o unixODBC-2.3.11.tar.gz ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.11.tar.gz
-#RUN tar -xvf unixODBC-2.3.9.tar.gz
-RUN tar -xvf unixODBC-2.3.11.tar.gz
-
-#WORKDIR /odbc/unixODBC-2.3.9
-WORKDIR /odbc/unixODBC-2.3.11
-RUN ./configure --prefix=/usr/local/unixODBC
-RUN make
-RUN make install
-
-ENV PATH=/usr/local/unixODBC/lib:$PATH
-
-WORKDIR /app
-COPY src .
-RUN dotnet publish -c Release -o out -r linux-x64 /p:Database=mysql
-
-# Construct the actual image that will run
-FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS runtime
-
-RUN apt-get update
-# The following installs standard versions unixodbc 2.3.6 and pgsqlodbc 11
-#RUN apt-get install -y unixodbc odbc-postgresql
-# unixodbc still needs to be installed even if compiled locally
-RUN apt-get install -y unixodbc wget curl
-
-WORKDIR /odbc
-
-#RUN curl -L -o mariadb-connector-odbc-3.1.14-debian-9-stretch-amd64.tar.gz https://downloads.mariadb.com/Connectors/odbc/connector-odbc-3.1.14/mariadb-connector-odbc-3.1.14-debian-9-stretch-amd64.tar.gz
-RUN curl -L -o mariadb-connector-odbc-3.1.17-debian-bullseye-amd64.tar.gz https://downloads.mariadb.com/Connectors/odbc/connector-odbc-3.1.17/mariadb-connector-odbc-3.1.17-debian-bullseye-amd64.tar.gz
-
-#RUN tar -xvzf mariadb-connector-odbc-3.1.14-debian-9-stretch-amd64.tar.gz
-#RUN cp mariadb-connector-odbc-3.1.14-debian-9-stretch-amd64/lib/mariadb/libm* /usr/lib/
-RUN tar -xvzf mariadb-connector-odbc-3.1.17-debian-bullseye-amd64.tar.gz
-RUN cp mariadb-connector-odbc-3.1.17-debian-bullseye-amd64/lib/mariadb/libm* /usr/lib/
-
-COPY --from=build /usr/local/unixODBC /usr/local/unixODBC
-
-# Check unixODBC version by: 
-# 1. Logging into containter: docker run --rm -it --entrypoint=/bin/bash techempower/tfb.test.appmpower
-# 2. odbcinst  --version
-
-ENV PATH=/usr/local/unixODBC/bin:$PATH
-
-WORKDIR /etc/
-COPY odbcinst.ini .
-
-WORKDIR /app
-COPY --from=build /app/out ./
-
-EXPOSE 8080
-
-ENTRYPOINT ["./appMpower"]

+ 3 - 59
frameworks/CSharp/appmpower/appmpower-odbc-pg.dockerfile

@@ -1,76 +1,20 @@
-FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
+FROM mcr.microsoft.com/dotnet/sdk:8.0.100 AS build
 RUN apt-get update
 RUN apt-get update
 RUN apt-get -yqq install clang zlib1g-dev libkrb5-dev libtinfo5
 RUN apt-get -yqq install clang zlib1g-dev libkrb5-dev libtinfo5
-RUN apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
-   libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
-   xz-utils tk-dev libffi-dev liblzma-dev pgpool2 vim-tiny
-
-WORKDIR /odbc
-
-# To compile the latest postgresql odbc driver, postgresql itself needs to be installed
-#RUN curl -L -o postgresql-14.1.tar.gz https://ftp.postgresql.org/pub/source/v14.1/postgresql-14.1.tar.gz
-#RUN curl -L -o unixODBC-2.3.9.tar.gz ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.9.tar.gz
-RUN curl -L -o unixODBC-2.3.11.tar.gz ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.11.tar.gz
-#RUN curl -L -o psqlodbc-13.02.0000.tar.gz https://ftp.postgresql.org/pub/odbc/versions/src/psqlodbc-13.02.0000.tar.gz
-
-#RUN tar -xvf postgresql-14.1.tar.gz
-#RUN tar -xvf unixODBC-2.3.9.tar.gz
-RUN tar -xvf unixODBC-2.3.11.tar.gz
-#RUN tar -xvf psqlodbc-13.02.0000.tar.gz
-
-#WORKDIR /odbc/postgresql-14.1
-#RUN ./configure
-#RUN make
-#RUN make install
-
-#ENV PATH=/usr/local/pgsql/bin:$PATH
-
-#WORKDIR /odbc/unixODBC-2.3.9
-WORKDIR /odbc/unixODBC-2.3.11
-RUN ./configure --prefix=/usr/local/unixODBC
-RUN make
-RUN make install
-
-ENV PATH=/usr/local/unixODBC/lib:$PATH
-
-#WORKDIR /odbc/psqlodbc-13.02.0000
-#RUN ./configure --with-unixodbc=/usr/local/unixODBC --with-libpq=/usr/local/pgsql --prefix=/usr/local/pgsqlodbc
-#RUN make
-#RUN make install
 
 
 WORKDIR /app
 WORKDIR /app
 COPY src .
 COPY src .
-RUN dotnet publish -c Release -o out -r linux-x64  /p:Database=postgresql
+RUN dotnet publish -c Release -o out /p:Driver=odbc
 
 
 # Construct the actual image that will run
 # Construct the actual image that will run
-FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS runtime
+FROM mcr.microsoft.com/dotnet/aspnet:8.0.0 AS runtime
 
 
 RUN apt-get update
 RUN apt-get update
-# The following installs standard versions unixodbc 2.3.6 and pgsqlodbc 11
 RUN apt-get install -y unixodbc odbc-postgresql
 RUN apt-get install -y unixodbc odbc-postgresql
 # unixodbc still needs to be installed even if compiled locally
 # unixodbc still needs to be installed even if compiled locally
-#RUN apt-get install -y unixodbc wget curl libpq-dev build-essential
-
-WORKDIR /odbc
-
-#RUN curl -L -o pgpool-II-4.2.3.tar.gz https://www.pgpool.net/mediawiki/download.php?f=pgpool-II-4.2.3.tar.gz
-#RUN tar -xvf pgpool-II-4.2.3.tar.gz
-
-#WORKDIR /odbc/pgpool-II-4.2.3
-#RUN ./configure
-#RUN make
-#RUN make install
-
-COPY --from=build /usr/local/unixODBC /usr/local/unixODBC
-
-# Check unixODBC version by: 
-# 1. Logging into containter: docker run --rm -it --entrypoint=/bin/bash techempower/tfb.test.appmpower
-# 2. odbcinst  --version
 
 
 ENV PATH=/usr/local/unixODBC/bin:$PATH
 ENV PATH=/usr/local/unixODBC/bin:$PATH
 
 
-#COPY --from=build /usr/local/pgsqlodbc /usr/local/pgsqlodbc
-
 WORKDIR /etc/
 WORKDIR /etc/
 COPY odbcinst.ini .
 COPY odbcinst.ini .
 
 

+ 3 - 4
frameworks/CSharp/appmpower/appmpower.dockerfile

@@ -1,14 +1,13 @@
-FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
+FROM mcr.microsoft.com/dotnet/sdk:8.0.100 AS build
 RUN apt-get update
 RUN apt-get update
 RUN apt-get -yqq install clang zlib1g-dev libkrb5-dev libtinfo5
 RUN apt-get -yqq install clang zlib1g-dev libkrb5-dev libtinfo5
 
 
 WORKDIR /app
 WORKDIR /app
 COPY src .
 COPY src .
-RUN dotnet publish -c Release -o out -r linux-x64
+RUN dotnet publish -c Release -o out
 
 
 # Construct the actual image that will run
 # Construct the actual image that will run
-FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS runtime
-RUN apt-get update
+FROM mcr.microsoft.com/dotnet/aspnet:8.0.0 AS runtime
 
 
 WORKDIR /app
 WORKDIR /app
 COPY --from=build /app/out ./
 COPY --from=build /app/out ./

+ 6 - 28
frameworks/CSharp/appmpower/benchmark_config.json

@@ -17,9 +17,9 @@
         "webserver": "Kestrel",
         "webserver": "Kestrel",
         "os": "Linux",
         "os": "Linux",
         "database_os": "Linux",
         "database_os": "Linux",
-        "display_name": "appMpower [Middleware]",
+        "display_name": "appMpower [aot-no-reflection]",
         "notes": "",
         "notes": "",
-        "versus": "aspcore-mw"
+        "versus": "aspnetcore-minimal"
       },
       },
       "odbc-pg": {
       "odbc-pg": {
         "db_url": "/db",
         "db_url": "/db",
@@ -39,31 +39,9 @@
         "webserver": "Kestrel",
         "webserver": "Kestrel",
         "os": "Linux",
         "os": "Linux",
         "database_os": "Linux",
         "database_os": "Linux",
-        "display_name": "appMpower [Middleware, Pg, Odbc]",
+        "display_name": "appMpower [aot-no-reflection,odbc]",
         "notes": "",
         "notes": "",
-        "versus": "aspcore-mw-ado-pg"
-      },
-      "odbc-my": {
-        "db_url": "/db",
-        "query_url": "/queries?c=",
-        "update_url": "/updates?c=",
-        "fortune_url": "/fortunes",
-        "cached_query_url": "/cached-worlds?c=",
-        "port": 8080,
-        "approach": "Realistic",
-        "classification": "Platform",
-        "database": "MySQL",
-        "framework": "appmpower",
-        "language": "C#",
-        "orm": "Raw",
-        "platform": ".NET",
-        "flavor": "CoreCLR",
-        "webserver": "Kestrel",
-        "os": "Linux",
-        "database_os": "Linux",
-        "display_name": "appMpower [Middleware, My, Odbc]",
-        "notes": "",
-        "versus": "aspcore-mw-ado-my"
+        "versus": "aspnetcore-minimal"
       },
       },
       "ado-pg": {
       "ado-pg": {
         "db_url": "/db",
         "db_url": "/db",
@@ -83,9 +61,9 @@
         "webserver": "Kestrel",
         "webserver": "Kestrel",
         "os": "Linux",
         "os": "Linux",
         "database_os": "Linux",
         "database_os": "Linux",
-        "display_name": "appMpower [Middleware, Pg, Ado]",
+        "display_name": "appMpower [aot-no-reflection,ado]",
         "notes": "",
         "notes": "",
-        "versus": "aspcore-mw-ado-pg"
+        "versus": "aspnetcore-minimal"
       }
       }
     }
     }
   ]
   ]

+ 3 - 19
frameworks/CSharp/appmpower/config.toml

@@ -12,7 +12,7 @@ os = "Linux"
 orm = "Raw"
 orm = "Raw"
 platform = ".NET"
 platform = ".NET"
 webserver = "kestrel"
 webserver = "kestrel"
-versus = "aspcore-mw"
+versus = "aspnetcore-minimal"
 
 
 [odbc-pg]
 [odbc-pg]
 urls.db = "/db"
 urls.db = "/db"
@@ -28,23 +28,7 @@ os = "Linux"
 orm = "Raw"
 orm = "Raw"
 platform = ".NET"
 platform = ".NET"
 webserver = "Kestrel"
 webserver = "Kestrel"
-versus = "aspcore-mw-ado-pg"
-
-[odbc-my]
-urls.db = "/db"
-urls.query = "/queries?c="
-urls.update = "/updates?c="
-urls.fortune = "/fortunes"
-urls.cached_query = "/cached-worlds?c="
-approach = "Realistic"
-classification = "Micro"
-database = "MySQL"
-database_os = "Linux"
-os = "Linux"
-orm = "Raw"
-platform = ".NET"
-webserver = "Kestrel"
-versus = "aspcore-mw-ado-my"
+versus = "aspnetcore-minimal"
 
 
 [ado-pg]
 [ado-pg]
 urls.db = "/db"
 urls.db = "/db"
@@ -60,4 +44,4 @@ os = "Linux"
 orm = "Raw"
 orm = "Raw"
 platform = ".NET"
 platform = ".NET"
 webserver = "Kestrel"
 webserver = "Kestrel"
-versus = "aspcore-mw-ado-pg"
+versus = "aspnetcore-minimal"

+ 0 - 6
frameworks/CSharp/appmpower/odbcinst.ini

@@ -5,7 +5,6 @@ Pooling=0
 
 
 [ODBC Drivers]
 [ODBC Drivers]
 PostgreSQL = Installed
 PostgreSQL = Installed
-MariaDB = Installed
 
 
 ;
 ;
 ;  odbcinst.ini
 ;  odbcinst.ini
@@ -20,8 +19,3 @@ Driver = /usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so
 ;Driver =/usr/local/pgsqlodbc/lib/psqlodbcw.so
 ;Driver =/usr/local/pgsqlodbc/lib/psqlodbcw.so
 Threading = 0
 Threading = 0
 CPTimeout = 0
 CPTimeout = 0
-
-[MariaDB]
-Description=MariaDB ODBC for MySQL
-Driver = /usr/lib/libmaodbc.so
-Threading   = 0

+ 1 - 1
frameworks/CSharp/appmpower/src/Data/DbProviderFactory.cs

@@ -7,7 +7,7 @@ namespace appMpower.Data
 #if MYSQL
 #if MYSQL
       public const string ConnectionString = "Driver={MariaDB};Server=tfb-database;Database=hello_world;Uid=benchmarkdbuser;Pwd=benchmarkdbpass;Pooling=false;OPTIONS=67108864;FLAG_FORWARD_CURSOR=1"; 
       public const string ConnectionString = "Driver={MariaDB};Server=tfb-database;Database=hello_world;Uid=benchmarkdbuser;Pwd=benchmarkdbpass;Pooling=false;OPTIONS=67108864;FLAG_FORWARD_CURSOR=1"; 
 #elif ADO
 #elif ADO
-      public const string ConnectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=18;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000"; 
+      public const string ConnectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=0;Maximum Pool Size=18;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000"; 
       //public const string ConnectionString = "Server=localhost;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=18;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000"; 
       //public const string ConnectionString = "Server=localhost;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=18;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000"; 
 #else
 #else
       public const string ConnectionString = "Driver={PostgreSQL};Server=tfb-database;Database=hello_world;Uid=benchmarkdbuser;Pwd=benchmarkdbpass;UseServerSidePrepare=1;Pooling=false";
       public const string ConnectionString = "Driver={PostgreSQL};Server=tfb-database;Database=hello_world;Uid=benchmarkdbuser;Pwd=benchmarkdbpass;UseServerSidePrepare=1;Pooling=false";

+ 0 - 7
frameworks/CSharp/appmpower/src/__BlockAllReflectionAttribute.cs

@@ -1,7 +0,0 @@
-#if ADO
-namespace System.Runtime.CompilerServices
-{
-   [AttributeUsage(AttributeTargets.All)]
-   internal class __BlockAllReflectionAttribute : Attribute { }
-}
-#endif

+ 0 - 49
frameworks/CSharp/appmpower/src/appMpower.ado

@@ -1,49 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
-
-   <PropertyGroup>
-      <TargetFramework>net7.0</TargetFramework>
-      <OutputType>Exe</OutputType>
-      <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-
-      <!-- Normal .NET 7 -->
-      <PublishAot>true</PublishAot>
-      <SelfContained>true</SelfContained>
-      <InvariantGlobalization>true</InvariantGlobalization>
-      <IlcGenerateStackTraceData>false</IlcGenerateStackTraceData>
-      <IlcOptimizationPreference>Speed</IlcOptimizationPreference>
-      <DebugType>none</DebugType>
-      <GenerateRuntimeConfigurationFiles>false</GenerateRuntimeConfigurationFiles>
-
-      <!-- Only some may work - From the experimental AOT version -->
-      <IlcFoldIdenticalMethodBodies>true</IlcFoldIdenticalMethodBodies>
-      <IlcTrimMetadata>true</IlcTrimMetadata>
-      <IlcInvariantGlobalization>true</IlcInvariantGlobalization>
-      <IlcGenerateCompleteTypeMetadata>false</IlcGenerateCompleteTypeMetadata>
-
-      <SuppressTrimAnalysisWarnings>true</SuppressTrimAnalysisWarnings>
-
-      <!--
-      <TrimMode>link</TrimMode>
-      -->
-
-      <!-- Opt out of the "easy mode" of the CoreRT compiler (http://aka.ms/OptimizeCoreRT) -->
-      <IlcPgoOptimize>true</IlcPgoOptimize>
-
-      <!-- This benchmark is marked Stripped, so we might as well do this: -->
-      <UseSystemResourceKeys>true</UseSystemResourceKeys>
-      <EventSourceSupport>false</EventSourceSupport>
-      <DebuggerSupport>false</DebuggerSupport>
-   </PropertyGroup>
-
-   <ItemGroup>
-      <PackageReference Include="Npgsql" Version="7.0.0" />
-      <PackageReference Include="System.Data.SqlClient" Version="4.8.5" />
-      <PackageReference Include="System.Data.Odbc" Version="7.0.0" />
-   </ItemGroup>
-
-   <PropertyGroup>
-      <DefineConstants>$(DefineConstants);ADO</DefineConstants>
-      <DefineConstants>$(DefineConstants);POSTGRESQL</DefineConstants>
-   </PropertyGroup>
-
-</Project>

+ 8 - 6
frameworks/CSharp/appmpower/src/appMpower.csproj

@@ -1,13 +1,13 @@
 <Project Sdk="Microsoft.NET.Sdk.Web">
 <Project Sdk="Microsoft.NET.Sdk.Web">
 
 
   <PropertyGroup>
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <OutputType>Exe</OutputType>
     <OutputType>Exe</OutputType>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
 
 
-    <RuntimeIdentifier>linux-x64</RuntimeIdentifier>
+    <!--<RuntimeIdentifier>linux-x64</RuntimeIdentifier>-->
 
 
-    <!-- Normal .NET 7 -->
+    <!-- Normal .NET 8 -->
     <PublishAot>true</PublishAot>
     <PublishAot>true</PublishAot>
     <SelfContained>true</SelfContained>
     <SelfContained>true</SelfContained>
     <InvariantGlobalization>true</InvariantGlobalization>
     <InvariantGlobalization>true</InvariantGlobalization>
@@ -42,12 +42,14 @@
   </PropertyGroup>
   </PropertyGroup>
 
 
   <ItemGroup>
   <ItemGroup>
-    <PackageReference Include="System.Data.Odbc" Version="7.0.0" />
+    <PackageReference Include="System.Data.Odbc" Version="8.0.0" />
+    <PackageReference Include="Npgsql" Version="8.0.0-*" />
   </ItemGroup>
   </ItemGroup>
 
 
   <PropertyGroup>
   <PropertyGroup>
-      <DefineConstants>$(DefineConstants);ODBC</DefineConstants>
-      <DefineConstants Condition=" '$(Database)' == 'mysql' ">$(DefineConstants);MYSQL</DefineConstants>
+      <DefineConstants>$(DefineConstants);POSTGRESQL</DefineConstants>
+      <DefineConstants Condition=" '$(Driver)' == 'odbc' ">$(DefineConstants);ODBC</DefineConstants>
+      <DefineConstants Condition=" '$(Driver)' == 'ado' ">$(DefineConstants);ADO</DefineConstants>
   </PropertyGroup>
   </PropertyGroup>
 
 
 </Project>
 </Project>

+ 1 - 1
frameworks/CSharp/appmpower/src/nuget.config

@@ -3,7 +3,7 @@
   <packageSources>
   <packageSources>
     <!--To inherit the global NuGet package sources remove the <clear/> line below -->
     <!--To inherit the global NuGet package sources remove the <clear/> line below -->
     <clear />
     <clear />
-    <add key="dotnet-experimental" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-experimental/nuget/v3/index.json" />
+    <add key="npgsql" value="https://www.myget.org/F/npgsql-vnext/api/v3/index.json" />
     <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
     <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
   </packageSources>
   </packageSources>
 </configuration>
 </configuration>