[REEF-1885] Update the .NET Core projects to target .NET Core and Standard 2.0

This changes the .netcore projects (*.DotNet.csproj) to target netstandard2.0
for libraries and netcoreapp2.0 for tests. The commit includes the following:

 * Moving the target frameworks into the build.DotNetLibrary.props and
   build.DotNetApp.props. Projects no longer define their own target frameworks
   and now include the appropriate .props file.
 * Adding conditional references of C# libraries to separate what is referenced
   for .net core builds vs .net46 or .net451.
 * Updated the code that interfaces with the Windows Azure Storage library since
   the non-async calls are note available for .netcore. To keep the code
   consistent for .netcore and .net, the new code calls the appropriate async
   version of the API and blocks until the call is complete. This also updates
   the tests to do the same thing.
 * Additional changes to the xunit.DotNet.props to get tests working on all
   platforms.

With these changes, we can now build the existing DotNet projects on linux
platforms.

JIRA:
  [REEF-1885](https://issues.apache.org/jira/browse/REEF-1885)

Pull request:
  This closes #1379
diff --git a/lang/cs/Org.Apache.REEF.Common/Org.Apache.REEF.Common.DotNet.csproj b/lang/cs/Org.Apache.REEF.Common/Org.Apache.REEF.Common.DotNet.csproj
index 396a6d3..d74f611 100644
--- a/lang/cs/Org.Apache.REEF.Common/Org.Apache.REEF.Common.DotNet.csproj
+++ b/lang/cs/Org.Apache.REEF.Common/Org.Apache.REEF.Common.DotNet.csproj
@@ -21,15 +21,16 @@
     <AssemblyName>Org.Apache.REEF.Common</AssemblyName>
     <Description>REEF Common Infrastructure</Description>
     <PackageTags>REEF Common Infrastructure</PackageTags>
-    <TargetFrameworks>netstandard2.0;netcoreapp2.0;net46;net451</TargetFrameworks>
   </PropertyGroup>
-  <Import Project="..\build.DotNet.props" />
+  <Import Project="..\build.DotNetLibrary.props" />
   <ItemGroup>
     <PackageReference Include="Newtonsoft.Json" Version="$(NewtonsoftJsonVersion)" />
     <PackageReference Include="protobuf-net" Version="$(ProtobufVersion)" />
     <PackageReference Include="Microsoft.Avro.Core" Version="$(AvroVersion)" />
     <PackageReference Include="System.Reactive.Core" Version="$(SystemReactiveVersion)" />
     <PackageReference Include="System.Reactive.Interfaces" Version="$(SystemReactiveVersion)" />
+  </ItemGroup>
+  <ItemGroup Condition="'$(TargetFramework)' == 'net451' Or '$(TargetFramework)' == 'net46'">
     <Reference Include="System" />
     <Reference Include="System.Core" />
     <Reference Include="System.Runtime.Serialization" />
diff --git a/lang/cs/Org.Apache.REEF.DotNet.sln b/lang/cs/Org.Apache.REEF.DotNet.sln
index a7cb0fb..0ca35da 100644
--- a/lang/cs/Org.Apache.REEF.DotNet.sln
+++ b/lang/cs/Org.Apache.REEF.DotNet.sln
@@ -1,9 +1,9 @@
 

 Microsoft Visual Studio Solution File, Format Version 12.00

 # Visual Studio 15

-VisualStudioVersion = 15.0.26403.7

+VisualStudioVersion = 15.0.26730.12

 MinimumVisualStudioVersion = 10.0.40219.1

-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Org.Apache.Reef.Utilities.DotNet", "Org.Apache.REEF.Utilities\Org.Apache.Reef.Utilities.DotNet.csproj", "{FE4CEA75-2F26-4C97-B256-375AA698B4A9}"

+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Org.Apache.REEF.Utilities.DotNet", "Org.Apache.REEF.Utilities\Org.Apache.REEF.Utilities.DotNet.csproj", "{FE4CEA75-2F26-4C97-B256-375AA698B4A9}"

 EndProject

 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Org.Apache.REEF.Tang.DotNet", "Org.Apache.REEF.Tang\Org.Apache.REEF.Tang.DotNet.csproj", "{16E1218C-9A3C-49E2-A939-C29944BBB72E}"

 EndProject

diff --git a/lang/cs/Org.Apache.REEF.Driver/Org.Apache.REEF.Driver.DotNet.csproj b/lang/cs/Org.Apache.REEF.Driver/Org.Apache.REEF.Driver.DotNet.csproj
index 2cd7d84..20145c0 100644
--- a/lang/cs/Org.Apache.REEF.Driver/Org.Apache.REEF.Driver.DotNet.csproj
+++ b/lang/cs/Org.Apache.REEF.Driver/Org.Apache.REEF.Driver.DotNet.csproj
@@ -21,12 +21,13 @@
     <AssemblyName>Org.Apache.REEF.Driver</AssemblyName>
     <Description>Driver for REEF.NET</Description>
     <PackageTags>REEF Driver</PackageTags>
-    <TargetFrameworks>netstandard2.0;netcoreapp2.0;net46;net451</TargetFrameworks>
   </PropertyGroup>
-  <Import Project="..\build.DotNet.props" />
+  <Import Project="..\build.DotNetLibrary.props" />
   <ItemGroup>
     <PackageReference Include="protobuf-net" Version="$(ProtobufVersion)" />
     <PackageReference Include="Microsoft.Avro.Core" Version="$(AvroVersion)" />
+  </ItemGroup>
+  <ItemGroup Condition="'$(TargetFramework)' == 'net451' Or '$(TargetGramework)' == 'net46'">
     <Reference Include="System" />
     <Reference Include="System.Core" />
     <Reference Include="System.Runtime.Serialization" />
diff --git a/lang/cs/Org.Apache.REEF.Evaluator.Tests/Org.Apache.REEF.Evaluator.Tests.DotNet.csproj b/lang/cs/Org.Apache.REEF.Evaluator.Tests/Org.Apache.REEF.Evaluator.Tests.DotNet.csproj
index b93b0f8..5f0a653 100644
--- a/lang/cs/Org.Apache.REEF.Evaluator.Tests/Org.Apache.REEF.Evaluator.Tests.DotNet.csproj
+++ b/lang/cs/Org.Apache.REEF.Evaluator.Tests/Org.Apache.REEF.Evaluator.Tests.DotNet.csproj
@@ -17,9 +17,8 @@
 -->
   <PropertyGroup>
     <AssemblyName>Org.Apache.REEF.Evaluator.Tests</AssemblyName>
-    <TargetFrameworks>net46;net451</TargetFrameworks>
   </PropertyGroup>
-  <Import Project="..\build.DotNet.props" />
+  <Import Project="..\build.DotNetApp.props" />
   <ItemGroup>
     <PackageReference Include="NSubstitute" Version="$(NSubstituteVersion)" />
     <PackageReference Include="protobuf-net" Version="$(ProtobufVersion)" />
diff --git a/lang/cs/Org.Apache.REEF.Evaluator/Org.Apache.REEF.Evaluator.DotNet.csproj b/lang/cs/Org.Apache.REEF.Evaluator/Org.Apache.REEF.Evaluator.DotNet.csproj
index 28e1c2f..c7bc5f9 100644
--- a/lang/cs/Org.Apache.REEF.Evaluator/Org.Apache.REEF.Evaluator.DotNet.csproj
+++ b/lang/cs/Org.Apache.REEF.Evaluator/Org.Apache.REEF.Evaluator.DotNet.csproj
@@ -21,11 +21,12 @@
     <AssemblyName>Org.Apache.REEF.Evaluator</AssemblyName>
     <Description>Evaluator for REEF.NET</Description>
     <PackageTags>REEF Evaluator</PackageTags>
-    <TargetFrameworks>netstandard2.0;netcoreapp2.0;net46;net451</TargetFrameworks>
   </PropertyGroup>
-  <Import Project="..\build.DotNet.props" />
+  <Import Project="..\build.DotNetLibrary.props" />
   <ItemGroup>
     <PackageReference Include="protobuf-net" Version="$(ProtobufVersion)" />
+  </ItemGroup>
+  <ItemGroup Condition="'$(TargetFramework)' == 'net451' Or '$(TargetFramework)' == 'net46'">
     <Reference Include="System" />
     <Reference Include="System.Core" />
     <Reference Include="System.Configuration" />
diff --git a/lang/cs/Org.Apache.REEF.Examples/Org.Apache.REEF.Examples.DotNet.csproj b/lang/cs/Org.Apache.REEF.Examples/Org.Apache.REEF.Examples.DotNet.csproj
index 663795d..99d3709 100644
--- a/lang/cs/Org.Apache.REEF.Examples/Org.Apache.REEF.Examples.DotNet.csproj
+++ b/lang/cs/Org.Apache.REEF.Examples/Org.Apache.REEF.Examples.DotNet.csproj
@@ -21,12 +21,13 @@
     <AssemblyName>Org.Apache.REEF.Examples</AssemblyName>
     <Description>REEF Examples</Description>
     <PackageTags>REEF Examples</PackageTags>
-    <TargetFrameworks>net46;net451</TargetFrameworks>
   </PropertyGroup>
-  <Import Project="..\build.DotNet.props" />
+  <Import Project="..\build.DotNetLibrary.props" />
   <ItemGroup>
     <PackageReference Include="Newtonsoft.Json" Version="$(NewtonsoftJsonVersion)" />
     <PackageReference Include="Microsoft.Avro.Core" Version="$(AvroVersion)" />
+  </ItemGroup>
+  <ItemGroup Condition="'$(TargetFramework)' == 'net451' Or '$(TargetFramework)' == 'net46'">
     <Reference Include="System" />
     <Reference Include="System.Core" />
     <Reference Include="System.Runtime.Serialization" />
diff --git a/lang/cs/Org.Apache.REEF.IO.Tests/Org.Apache.REEF.IO.Tests.DotNet.csproj b/lang/cs/Org.Apache.REEF.IO.Tests/Org.Apache.REEF.IO.Tests.DotNet.csproj
index 2b7fd61..1ab52b7 100644
--- a/lang/cs/Org.Apache.REEF.IO.Tests/Org.Apache.REEF.IO.Tests.DotNet.csproj
+++ b/lang/cs/Org.Apache.REEF.IO.Tests/Org.Apache.REEF.IO.Tests.DotNet.csproj
@@ -17,12 +17,13 @@
 -->
   <PropertyGroup>
     <AssemblyName>Org.Apache.REEF.IO.Tests</AssemblyName>
-    <TargetFrameworks>net46;net451</TargetFrameworks>
   </PropertyGroup>
-  <Import Project="..\build.DotNet.props" />
+  <Import Project="..\build.DotNetApp.props" />
   <ItemGroup>
     <PackageReference Include="NSubstitute" Version="$(NSubstituteVersion)" />
     <PackageReference Include="WindowsAzure.Storage" Version="$(WindowsAzureStorageVersion)" />
+  </ItemGroup>
+  <ItemGroup Condition="'$(TargetFramework)' == 'net451' Or '$(TargetFramework)' == 'net46'">
     <Reference Include="System" />
     <Reference Include="System.Core" />
     <Reference Include="System.Xml.Linq" />
diff --git a/lang/cs/Org.Apache.REEF.IO.Tests/TestAzureBlockBlobFileSystem.cs b/lang/cs/Org.Apache.REEF.IO.Tests/TestAzureBlockBlobFileSystem.cs
index 1c622d2..a1f9b34 100644
--- a/lang/cs/Org.Apache.REEF.IO.Tests/TestAzureBlockBlobFileSystem.cs
+++ b/lang/cs/Org.Apache.REEF.IO.Tests/TestAzureBlockBlobFileSystem.cs
@@ -18,6 +18,7 @@
 using System;
 using System.IO;
 using System.Linq;
+using System.Threading.Tasks;
 using Microsoft.WindowsAzure.Storage;
 using Microsoft.WindowsAzure.Storage.Blob;
 using NSubstitute;
@@ -114,7 +115,7 @@
             testContext.TestCloudBlobContainer.Received(1).GetDirectoryReference("directory");
             testContext.TestCloudBlobDirectory.Received(1).GetDirectoryReference("directory");
             testContext.TestCloudBlobDirectory.Received(1).ListBlobs(true);
-            testContext.TestCloudBlob.Received(5).DeleteIfExists();
+            testContext.TestCloudBlob.Received(5).DeleteIfExistsAsync();
         }
 
         [Fact]
diff --git a/lang/cs/Org.Apache.REEF.IO.Tests/TestAzureBlockBlobFileSystemE2E.cs b/lang/cs/Org.Apache.REEF.IO.Tests/TestAzureBlockBlobFileSystemE2E.cs
index f2f4a11..8e8a708 100644
--- a/lang/cs/Org.Apache.REEF.IO.Tests/TestAzureBlockBlobFileSystemE2E.cs
+++ b/lang/cs/Org.Apache.REEF.IO.Tests/TestAzureBlockBlobFileSystemE2E.cs
@@ -49,25 +49,53 @@
 
             _fileSystem = TangFactory.GetTang().NewInjector(conf).GetInstance<AzureBlockBlobFileSystem>();
             _container = CloudStorageAccount.Parse(connectionString).CreateCloudBlobClient().GetContainerReference(defaultContainerName);
-            _container.CreateIfNotExists();
+            _container.CreateIfNotExistsAsync().Wait();
         }
 
         public void Dispose()
         {
             if (_container != null)
             {
-                _container.DeleteIfExists();
+                _container.DeleteIfExistsAsync().Wait();
             }
         }
 
+        private bool CheckBlobExists(ICloudBlob blob)
+        {
+            var task = blob.ExistsAsync();
+            task.Wait();
+            return task.Result;
+        }
+
+        private bool CheckContainerExists(CloudBlobContainer container)
+        {
+            var task = container.ExistsAsync();
+            task.Wait();
+            return task.Result;
+        }
+
+        private ICloudBlob GetBlobReferenceFromServer(CloudBlobContainer container, string blobName)
+        {
+            var task = container.GetBlobReferenceFromServerAsync(blobName);
+            task.Wait();
+            return task.Result;
+        }
+
+        private string DownloadText(CloudBlockBlob blob)
+        {
+            var task = blob.DownloadTextAsync();
+            task.Wait();
+            return task.Result;
+        }
+
         [Fact(Skip = "Fill in credentials before running test")]
         public void TestDeleteE2E()
         {
             var blob = _container.GetBlockBlobReference(HelloFile);
             UploadFromString(blob, "hello");
-            Assert.True(blob.Exists());
+            Assert.True(CheckBlobExists(blob));
             _fileSystem.Delete(PathToFile(HelloFile));
-            Assert.False(blob.Exists());
+            Assert.False(CheckBlobExists(blob));
         }
 
         [Fact(Skip = "Fill in credentials before running test")]
@@ -77,7 +105,7 @@
             var blob = _container.GetBlockBlobReference(HelloFile);
             UploadFromString(blob, "hello");
             Assert.True(_fileSystem.Exists(helloFilePath));
-            blob.DeleteIfExists();
+            blob.DeleteIfExistsAsync().Wait();
             Assert.False(_fileSystem.Exists(helloFilePath));
         }
 
@@ -90,15 +118,15 @@
             var destFilePath = PathToFile(destFileName);
             ICloudBlob srcBlob = _container.GetBlockBlobReference(srcFileName);
             UploadFromString(srcBlob, "hello");
-            Assert.True(srcBlob.Exists());
+            Assert.True(CheckBlobExists(srcBlob));
             ICloudBlob destBlob = _container.GetBlockBlobReference(destFileName);
-            Assert.False(destBlob.Exists());
+            Assert.False(CheckBlobExists(destBlob));
             _fileSystem.Copy(srcFilePath, destFilePath);
-            destBlob = _container.GetBlobReferenceFromServer(destFileName);
-            Assert.True(destBlob.Exists());
-            srcBlob = _container.GetBlobReferenceFromServer(srcFileName);
-            Assert.True(srcBlob.Exists());
-            Assert.Equal(_container.GetBlockBlobReference(srcFileName).DownloadText(), _container.GetBlockBlobReference(destFileName).DownloadText());
+            destBlob = GetBlobReferenceFromServer(_container, destFileName);
+            Assert.True(CheckBlobExists(destBlob));
+            srcBlob = GetBlobReferenceFromServer(_container, srcFileName);
+            Assert.True(CheckBlobExists(srcBlob));
+            Assert.Equal(DownloadText(_container.GetBlockBlobReference(srcFileName)), DownloadText(_container.GetBlockBlobReference(destFileName)));
         }
 
         [Fact(Skip = "Fill in credentials before running test")]
@@ -126,18 +154,18 @@
         {
             var helloFilePath = PathToFile(HelloFile);
             ICloudBlob blob = _container.GetBlockBlobReference(HelloFile);
-            Assert.False(blob.Exists());
+            Assert.False(CheckBlobExists(blob));
             var tempFilePath = GetTempFilePath();
             const string text = "hello";
             try
             {
                 File.WriteAllText(tempFilePath, text);
                 _fileSystem.CopyFromLocal(tempFilePath, helloFilePath);
-                blob = _container.GetBlobReferenceFromServer(HelloFile);
-                Assert.True(blob.Exists());
+                blob = GetBlobReferenceFromServer(_container, HelloFile);
+                Assert.True(CheckBlobExists(blob));
                 using (var stream = new MemoryStream())
                 {
-                    blob.DownloadToStream(stream);
+                    blob.DownloadToStreamAsync(stream).Wait();
                     stream.Seek(0, SeekOrigin.Begin);
 
                     using (var sr = new StreamReader(stream))
@@ -157,7 +185,7 @@
         public void TestDeleteDirectoryAtContainerE2E()
         {
             _fileSystem.DeleteDirectory(_container.Uri);
-            Assert.False(_container.Exists());
+            Assert.False(CheckContainerExists(_container));
         }
 
         [Fact(Skip = "Fill in credentials before running test")]
@@ -171,7 +199,7 @@
                 var filePath = directory + '/' + i;
                 var blockBlob = _container.GetBlockBlobReference(filePath);
                 UploadFromString(blockBlob, "hello");
-                Assert.True(blockBlob.Exists());
+                Assert.True(CheckBlobExists(blockBlob));
                 blockBlobs.Add(blockBlob);
             }
 
@@ -179,10 +207,10 @@
 
             foreach (var blockBlob in blockBlobs)
             {
-                Assert.False(blockBlob.Exists());
+                Assert.False(CheckBlobExists(blockBlob));
             }
 
-            Assert.True(_container.Exists());
+            Assert.True(CheckContainerExists(_container));
         }
 
         [Fact(Skip = "Fill in credentials before running test")]
@@ -201,8 +229,8 @@
                 var blockBlob2 = _container.GetBlockBlobReference(filePath2);
                 UploadFromString(blockBlob1, "hello");
                 UploadFromString(blockBlob2, "hello");
-                Assert.True(blockBlob1.Exists());
-                Assert.True(blockBlob2.Exists());
+                Assert.True(CheckBlobExists(blockBlob1));
+                Assert.True(CheckBlobExists(blockBlob2));
                 blockBlobs1.Add(blockBlob1);
                 blockBlobs2.Add(blockBlob2);
             }
@@ -211,15 +239,15 @@
 
             foreach (var blockBlob in blockBlobs2)
             {
-                Assert.False(blockBlob.Exists());
+                Assert.False(CheckBlobExists(blockBlob));
             }
 
             foreach (var blockBlob in blockBlobs1)
             {
-                Assert.True(blockBlob.Exists());
+                Assert.True(CheckBlobExists(blockBlob));
             }
 
-            Assert.True(_container.Exists());
+            Assert.True(CheckContainerExists(_container));
         }
 
         private static string GetTempFilePath()
@@ -230,7 +258,7 @@
         private static void UploadFromString(ICloudBlob blob, string str)
         {
             var byteArray = Encoding.UTF8.GetBytes(str);
-            blob.UploadFromByteArray(byteArray, 0, byteArray.Length);
+            blob.UploadFromByteArrayAsync(byteArray, 0, byteArray.Length).Wait();
         }
 
         private Uri PathToFile(string filePath)
diff --git a/lang/cs/Org.Apache.REEF.IO/FileSystem/AzureBlob/AzureBlockBlobFileSystem.cs b/lang/cs/Org.Apache.REEF.IO/FileSystem/AzureBlob/AzureBlockBlobFileSystem.cs
index 05267b6..b5f659c 100644
--- a/lang/cs/Org.Apache.REEF.IO/FileSystem/AzureBlob/AzureBlockBlobFileSystem.cs
+++ b/lang/cs/Org.Apache.REEF.IO/FileSystem/AzureBlob/AzureBlockBlobFileSystem.cs
@@ -147,7 +147,7 @@
 
             foreach (var blob in directory.ListBlobs(true).OfType<ICloudBlob>())
             {
-                blob.DeleteIfExists();
+                blob.DeleteIfExistsAsync().Wait();
             }
         }
 
diff --git a/lang/cs/Org.Apache.REEF.IO/FileSystem/AzureBlob/AzureCloudBlobClient.cs b/lang/cs/Org.Apache.REEF.IO/FileSystem/AzureBlob/AzureCloudBlobClient.cs
index ab92bf3..86d55fa 100644
--- a/lang/cs/Org.Apache.REEF.IO/FileSystem/AzureBlob/AzureCloudBlobClient.cs
+++ b/lang/cs/Org.Apache.REEF.IO/FileSystem/AzureBlob/AzureCloudBlobClient.cs
@@ -52,7 +52,9 @@
 
         public ICloudBlob GetBlobReferenceFromServer(Uri blobUri)
         {
-            return _client.GetBlobReferenceFromServer(blobUri);
+            var task = _client.GetBlobReferenceFromServerAsync(blobUri);
+            task.Wait();
+            return task.Result;
         }
 
         public ICloudBlobContainer GetContainerReference(string containerName)
@@ -69,8 +71,10 @@
             int? maxResults, BlobContinuationToken continuationToken, BlobRequestOptions blobRequestOptions,
             OperationContext operationContext)
         {
-            return _client.ListBlobsSegmented(prefix, useFlatListing, blobListingDetails, maxResults, continuationToken,
-                blobRequestOptions, operationContext);
+            var task = _client.ListBlobsSegmentedAsync(prefix, useFlatListing, blobListingDetails, maxResults,  continuationToken, 
+                                                        blobRequestOptions, operationContext);
+            task.Wait();
+            return task.Result;
         }
     }
 }
diff --git a/lang/cs/Org.Apache.REEF.IO/FileSystem/AzureBlob/AzureCloudBlobContainer.cs b/lang/cs/Org.Apache.REEF.IO/FileSystem/AzureBlob/AzureCloudBlobContainer.cs
index fb9ff81..03b9123 100644
--- a/lang/cs/Org.Apache.REEF.IO/FileSystem/AzureBlob/AzureCloudBlobContainer.cs
+++ b/lang/cs/Org.Apache.REEF.IO/FileSystem/AzureBlob/AzureCloudBlobContainer.cs
@@ -33,7 +33,7 @@
 
         public void DeleteIfExists()
         {
-            _container.DeleteIfExists();
+            _container.DeleteIfExistsAsync().Wait();
         }
 
         public ICloudBlobDirectory GetDirectoryReference(string directoryName)
diff --git a/lang/cs/Org.Apache.REEF.IO/FileSystem/AzureBlob/AzureCloudBlobDirectory.cs b/lang/cs/Org.Apache.REEF.IO/FileSystem/AzureBlob/AzureCloudBlobDirectory.cs
index 599c02a..bf6c4b0 100644
--- a/lang/cs/Org.Apache.REEF.IO/FileSystem/AzureBlob/AzureCloudBlobDirectory.cs
+++ b/lang/cs/Org.Apache.REEF.IO/FileSystem/AzureBlob/AzureCloudBlobDirectory.cs
@@ -39,7 +39,9 @@
 
         public IEnumerable<IListBlobItem> ListBlobs(bool useFlatListing = false)
         {
-            return _directory.ListBlobs(useFlatListing);
+            var task = _directory.ListBlobsSegmentedAsync(useFlatListing, BlobListingDetails.All, null, null, null, null);
+            task.Wait();
+            return task.Result.Results;
         }
     }
 }
diff --git a/lang/cs/Org.Apache.REEF.IO/FileSystem/AzureBlob/AzureCloudBlockBlob.cs b/lang/cs/Org.Apache.REEF.IO/FileSystem/AzureBlob/AzureCloudBlockBlob.cs
index 4420b98..c4b9c6d 100644
--- a/lang/cs/Org.Apache.REEF.IO/FileSystem/AzureBlob/AzureCloudBlockBlob.cs
+++ b/lang/cs/Org.Apache.REEF.IO/FileSystem/AzureBlob/AzureCloudBlockBlob.cs
@@ -61,41 +61,45 @@
 
         public bool Exists()
         {
-            return _blob.Exists();
+            var task = _blob.ExistsAsync();
+            task.Wait();
+            return task.Result;
         }
 
         public void Delete()
         {
-            _blob.Delete();
+            _blob.DeleteAsync().Wait();
         }
 
         public void DeleteIfExists()
         {
-            _blob.DeleteIfExists();
+            _blob.DeleteIfExistsAsync().Wait();
         }
 
         public string StartCopy(Uri source)
         {
-            return _blob.StartCopy(source);
+            var task = _blob.StartCopyAsync(source);
+            task.Wait();
+            return task.Result;
         }
 
         public void DownloadToFile(string path, FileMode mode)
         {
-            _blob.DownloadToFile(path, mode);
+            _blob.DownloadToFileAsync(path, mode).Wait();
         }
 
         public void UploadFromFile(string path, FileMode mode)
         {
             #if DOTNET_BUILD
-                _blob.UploadFromFile(path);
+                _blob.UploadFromFileAsync(path).Wait();
             #else
-                _blob.UploadFromFile(path, mode);
+                _blob.UploadFromFileAsync(path, mode).Wait();
             #endif
         }
 
         public void FetchAttributes()
         {
-            _blob.FetchAttributes();
+            _blob.FetchAttributesAsync().Wait();
         }
     }
-}
+}
\ No newline at end of file
diff --git a/lang/cs/Org.Apache.REEF.IO/Org.Apache.REEF.IO.DotNet.csproj b/lang/cs/Org.Apache.REEF.IO/Org.Apache.REEF.IO.DotNet.csproj
index fd2ba53..6e9bd6a 100644
--- a/lang/cs/Org.Apache.REEF.IO/Org.Apache.REEF.IO.DotNet.csproj
+++ b/lang/cs/Org.Apache.REEF.IO/Org.Apache.REEF.IO.DotNet.csproj
@@ -21,9 +21,8 @@
     <AssemblyName>Org.Apache.REEF.IO</AssemblyName>
     <Description>I/O library for Apache REEF</Description>
     <PackageTags> Apache REEF IO</PackageTags>
-    <TargetFrameworks>net46;net451</TargetFrameworks>
   </PropertyGroup>
-  <Import Project="..\build.DotNet.props" />
+  <Import Project="..\build.DotNetLibrary.props" />
   <ItemGroup>
     <PackageReference Include="Microsoft.Azure.KeyVault.Core" Version="2.0.4" />
     <PackageReference Include="Microsoft.Data.Edm" Version="5.8.2" />
@@ -32,11 +31,16 @@
     <PackageReference Include="System.Spatial" Version="5.8.2" />
     <PackageReference Include="WindowsAzure.Storage" Version="$(WindowsAzureStorageVersion)" />
     <PackageReference Include="Newtonsoft.Json" Version="$(NewtonsoftJsonVersion)" />
+  </ItemGroup>
+  <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
+    <PackageReference Include="System.IO.FileSystem.AccessControl" Version="4.4.0" />
+  </ItemGroup>
+  <ItemGroup Condition="'$(TargetFramework)' == 'net451' Or '$(TargetFramework)' == 'net46'">
+    <Reference Include="Microsoft.CSharp" />
     <Reference Include="System" />
     <Reference Include="System.Core" />
     <Reference Include="System.Xml.Linq" />
     <Reference Include="System.Data.DataSetExtensions" />
-    <Reference Include="Microsoft.CSharp" />
     <Reference Include="System.Data" />
     <Reference Include="System.Xml" />
   </ItemGroup>
diff --git a/lang/cs/Org.Apache.REEF.Network.Examples/Org.Apache.REEF.Network.Examples.DotNet.csproj b/lang/cs/Org.Apache.REEF.Network.Examples/Org.Apache.REEF.Network.Examples.DotNet.csproj
index 74a2ee4..ae177f5 100644
--- a/lang/cs/Org.Apache.REEF.Network.Examples/Org.Apache.REEF.Network.Examples.DotNet.csproj
+++ b/lang/cs/Org.Apache.REEF.Network.Examples/Org.Apache.REEF.Network.Examples.DotNet.csproj
@@ -21,10 +21,9 @@
     <AssemblyName>Org.Apache.REEF.Network.Examples</AssemblyName>
     <Description>Examples for network services for REEF</Description>
     <PackageTags>REEF Network services examples</PackageTags>
-    <TargetFrameworks>net46;net451</TargetFrameworks>
   </PropertyGroup>
-  <Import Project="..\build.DotNet.props" />
-  <ItemGroup>
+  <Import Project="..\build.DotNetLibrary.props" />
+  <ItemGroup Condition="'$(TargetFramework)' == 'net451' Or '$(TargetFramework)' == 'net46'">
     <Reference Include="System" />
     <Reference Include="System.Core" />
     <Reference Include="System.Xml.Linq" />
diff --git a/lang/cs/Org.Apache.REEF.Network.Tests/Org.Apache.REEF.Network.Tests.DotNet.csproj b/lang/cs/Org.Apache.REEF.Network.Tests/Org.Apache.REEF.Network.Tests.DotNet.csproj
index 784c6ed..782ab9a 100644
--- a/lang/cs/Org.Apache.REEF.Network.Tests/Org.Apache.REEF.Network.Tests.DotNet.csproj
+++ b/lang/cs/Org.Apache.REEF.Network.Tests/Org.Apache.REEF.Network.Tests.DotNet.csproj
@@ -17,12 +17,13 @@
 -->
   <PropertyGroup>
     <AssemblyName>Org.Apache.REEF.Network.Tests</AssemblyName>
-    <TargetFrameworks>net46;net451</TargetFrameworks>
   </PropertyGroup>
-  <Import Project="..\build.DotNet.props" />
+  <Import Project="..\build.DotNetApp.props" />
   <ItemGroup>
     <PackageReference Include="System.Reactive.Core" Version="$(SystemReactiveVersion)" />
     <PackageReference Include="System.Reactive.Interfaces" Version="$(SystemReactiveVersion)" />
+  </ItemGroup>
+  <ItemGroup Condition="'$(TargetFramework)' == 'net451' Or '$(TargetFramework)' == 'net46'">
     <Reference Include="System" />
   </ItemGroup>
   <Import Project="..\xunit.DotNet.props" />
diff --git a/lang/cs/Org.Apache.REEF.Network/Org.Apache.REEF.Network.DotNet.csproj b/lang/cs/Org.Apache.REEF.Network/Org.Apache.REEF.Network.DotNet.csproj
index 021c7be..30d1f8f 100644
--- a/lang/cs/Org.Apache.REEF.Network/Org.Apache.REEF.Network.DotNet.csproj
+++ b/lang/cs/Org.Apache.REEF.Network/Org.Apache.REEF.Network.DotNet.csproj
@@ -21,17 +21,18 @@
     <AssemblyName>Org.Apache.REEF.Network</AssemblyName>
     <Description>Network services for REEF</Description>
     <PackageTags>REEF Network services</PackageTags>
-    <TargetFrameworks>net46;net451</TargetFrameworks>
   </PropertyGroup>
-  <Import Project="..\build.DotNet.props" />
+  <Import Project="..\build.DotNetLibrary.props" />
   <ItemGroup>
     <PackageReference Include="protobuf-net" Version="$(ProtobufVersion)" />
     <PackageReference Include="Microsoft.Avro.Core" Version="$(AvroVersion)" />
     <PackageReference Include="System.Reactive.Core" Version="$(SystemReactiveVersion)" />
     <PackageReference Include="System.Reactive.Interfaces" Version="$(SystemReactiveVersion)" />
+    <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="1.1.2" />
+  </ItemGroup>
+  <ItemGroup Condition="'$(TargetFramework)' == 'net451' Or '$(TargetFramework)' == 'net46'">
     <Reference Include="System" />
     <Reference Include="System.Core" />
-    <Reference Include="System.Runtime.Caching" />
     <Reference Include="System.Runtime.Serialization" />
     <Reference Include="System.Xml" />
   </ItemGroup>
diff --git a/lang/cs/Org.Apache.REEF.Tang.Examples/Org.Apache.REEF.Tang.Examples.DotNet.csproj b/lang/cs/Org.Apache.REEF.Tang.Examples/Org.Apache.REEF.Tang.Examples.DotNet.csproj
index 93ab354..3af5f8c 100644
--- a/lang/cs/Org.Apache.REEF.Tang.Examples/Org.Apache.REEF.Tang.Examples.DotNet.csproj
+++ b/lang/cs/Org.Apache.REEF.Tang.Examples/Org.Apache.REEF.Tang.Examples.DotNet.csproj
@@ -21,10 +21,9 @@
     <AssemblyName>Org.Apache.REEF.Tang.Examples</AssemblyName>
     <Description>Examples using the Tang framework</Description>
     <PackageTags> Apache REEF tang dependency injection examples</PackageTags>
-    <TargetFrameworks>net46;net451</TargetFrameworks>
   </PropertyGroup>
-  <Import Project="..\build.DotNet.props" />
-  <ItemGroup>
+  <Import Project="..\build.DotNetLibrary.props" />
+  <ItemGroup Condition="'$(TargetFramework)' == 'net451' Or '$(TargetFramework)' == 'net46'">
     <Reference Include="System" />
     <Reference Include="System.Core" />
   </ItemGroup>
diff --git a/lang/cs/Org.Apache.REEF.Tang.Tests/Org.Apache.REEF.Tang.Tests.DotNet.csproj b/lang/cs/Org.Apache.REEF.Tang.Tests/Org.Apache.REEF.Tang.Tests.DotNet.csproj
index 2b09cf2..c21b56f 100644
--- a/lang/cs/Org.Apache.REEF.Tang.Tests/Org.Apache.REEF.Tang.Tests.DotNet.csproj
+++ b/lang/cs/Org.Apache.REEF.Tang.Tests/Org.Apache.REEF.Tang.Tests.DotNet.csproj
@@ -17,17 +17,18 @@
 -->
   <PropertyGroup>
     <AssemblyName>Org.Apache.REEF.Tang.Tests</AssemblyName>
-    <TargetFrameworks>net46;net451</TargetFrameworks>
   </PropertyGroup>
-  <Import Project="..\build.DotNet.props" />
+  <Import Project="..\build.DotNetApp.props" />
   <ItemGroup>
     <PackageReference Include="Newtonsoft.Json" Version="$(NewtonsoftJsonVersion)" />
     <PackageReference Include="protobuf-net" Version="$(ProtobufVersion)" />
     <PackageReference Include="Microsoft.Avro.Core" Version="$(AvroVersion)" />
+  </ItemGroup>
+  <Import Project="..\xunit.DotNet.props" />
+  <ItemGroup Condition="'$(TargetFramework)' == 'net451' Or '$(TargetFramework)' == 'net46'">
     <Reference Include="System" />
     <Reference Include="System.Core" />
   </ItemGroup>
-  <Import Project="..\xunit.DotNet.props" />
   <ItemGroup>
       <None Include="simpleConstructorJavaProto.bin">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
diff --git a/lang/cs/Org.Apache.REEF.Tang.Tools/Org.Apache.REEF.Tang.Tools.DotNet.csproj b/lang/cs/Org.Apache.REEF.Tang.Tools/Org.Apache.REEF.Tang.Tools.DotNet.csproj
index 962f9cc..4b95544 100644
--- a/lang/cs/Org.Apache.REEF.Tang.Tools/Org.Apache.REEF.Tang.Tools.DotNet.csproj
+++ b/lang/cs/Org.Apache.REEF.Tang.Tools/Org.Apache.REEF.Tang.Tools.DotNet.csproj
@@ -20,9 +20,8 @@
     <Description>Tools for Tang</Description>
     <PackageTags>Apache REEF Tang dependency injection</PackageTags>
     <OutputType>Exe</OutputType>
-    <TargetFrameworks>net46;net451</TargetFrameworks>
   </PropertyGroup>
-  <Import Project="..\build.DotNet.props" />
+  <Import Project="..\build.DotNetApp.props" />
   <ItemGroup>
     <ProjectReference Include="..\Org.Apache.REEF.Tang\Org.Apache.REEF.Tang.DotNet.csproj" />
     <ProjectReference Include="..\Org.Apache.REEF.Common\Org.Apache.REEF.Common.DotNet.csproj" />
diff --git a/lang/cs/Org.Apache.REEF.Tang/Org.Apache.REEF.Tang.DotNet.csproj b/lang/cs/Org.Apache.REEF.Tang/Org.Apache.REEF.Tang.DotNet.csproj
index d745fba..6369476 100644
--- a/lang/cs/Org.Apache.REEF.Tang/Org.Apache.REEF.Tang.DotNet.csproj
+++ b/lang/cs/Org.Apache.REEF.Tang/Org.Apache.REEF.Tang.DotNet.csproj
@@ -21,13 +21,14 @@
     <AssemblyName>Org.Apache.REEF.Tang</AssemblyName>
     <Description>Tang is a dependency injection framework</Description>
     <PackageTags> Apache REEF tang dependency injection</PackageTags>
-    <TargetFrameworks>netstandard2.0;netcoreapp2.0;net46;net451</TargetFrameworks>
   </PropertyGroup>
-  <Import Project="..\build.DotNet.props" />
+  <Import Project="..\build.DotNetLibrary.props" />
   <ItemGroup>
     <PackageReference Include="Newtonsoft.Json" Version="$(NewtonsoftJsonVersion)" />
     <PackageReference Include="protobuf-net" Version="$(ProtobufVersion)" />
     <PackageReference Include="Microsoft.Avro.Core" Version="$(AvroVersion)" />
+  </ItemGroup>
+  <ItemGroup Condition="'$(TargetFramework)' == 'net451' Or '$(TargetFramework)' == 'net46'">
     <Reference Include="System" />
     <Reference Include="System.Core" />
     <Reference Include="System.Runtime.Serialization" />
diff --git a/lang/cs/Org.Apache.REEF.Utilities/Org.Apache.REEF.Utilities.DotNet.csproj b/lang/cs/Org.Apache.REEF.Utilities/Org.Apache.REEF.Utilities.DotNet.csproj
index 2a65732..ae531e4 100644
--- a/lang/cs/Org.Apache.REEF.Utilities/Org.Apache.REEF.Utilities.DotNet.csproj
+++ b/lang/cs/Org.Apache.REEF.Utilities/Org.Apache.REEF.Utilities.DotNet.csproj
@@ -19,9 +19,8 @@
     <AssemblyName>Org.Apache.REEF.Utilities</AssemblyName>
     <Description>Common utilities such as logging shared across REEF/Wake/Tang</Description>
     <PackageTags>Apache REEF REEF/Wake/Tang common utilities</PackageTags>
-    <TargetFrameworks>netstandard2.0;netcoreapp2.0;net46;net451</TargetFrameworks>
   </PropertyGroup>
-  <Import Project="..\build.DotNet.props" />
+  <Import Project="..\build.DotNetLibrary.props" />
   <ItemGroup>
       <PackageReference Include="Newtonsoft.Json" Version="$(NewtonsoftJsonVersion)" />
   </ItemGroup>
diff --git a/lang/cs/Org.Apache.REEF.Wake.Tests/Org.Apache.REEF.Wake.Tests.DotNet.csproj b/lang/cs/Org.Apache.REEF.Wake.Tests/Org.Apache.REEF.Wake.Tests.DotNet.csproj
index f75962e..dc73da0 100644
--- a/lang/cs/Org.Apache.REEF.Wake.Tests/Org.Apache.REEF.Wake.Tests.DotNet.csproj
+++ b/lang/cs/Org.Apache.REEF.Wake.Tests/Org.Apache.REEF.Wake.Tests.DotNet.csproj
@@ -17,9 +17,8 @@
 -->
   <PropertyGroup>
     <AssemblyName>Org.Apache.REEF.Wake.Tests</AssemblyName>
-    <TargetFrameworks>netstandard2.0;netcoreapp2.0;net46;net451</TargetFrameworks>
   </PropertyGroup>
-  <Import Project="..\build.DotNet.props" />
+  <Import Project="..\build.DotNetApp.props" />
   <ItemGroup>
     <PackageReference Include="System.Reactive.Core" Version="$(SystemReactiveVersion)" />
     <PackageReference Include="System.Reactive.Interfaces" Version="$(SystemReactiveVersion)" />
diff --git a/lang/cs/Org.Apache.REEF.Wake/Org.Apache.REEF.Wake.DotNet.csproj b/lang/cs/Org.Apache.REEF.Wake/Org.Apache.REEF.Wake.DotNet.csproj
index b2f59d5..076a90b 100644
--- a/lang/cs/Org.Apache.REEF.Wake/Org.Apache.REEF.Wake.DotNet.csproj
+++ b/lang/cs/Org.Apache.REEF.Wake/Org.Apache.REEF.Wake.DotNet.csproj
@@ -19,16 +19,17 @@
     <AssemblyName>Org.Apache.REEF.Wake</AssemblyName>
     <Description>Wake is an event-driven framework</Description>
     <PackageTags>wake event-driven</PackageTags>
-    <TargetFrameworks>netstandard2.0;netcoreapp2.0;net46;net451</TargetFrameworks>
   </PropertyGroup>
-  <Import Project="..\build.DotNet.props" />
+  <Import Project="..\build.DotNetLibrary.props" />
   <ItemGroup>
+    <PackageReference Include="protobuf-net" Version="$(ProtobufVersion)" />
+    <PackageReference Include="EnterpriseLibrary.TransientFaultHandling.Core" Version="$(TransientFaultHandlingVersion)" NoWarn="NU1603" />
+    <PackageReference Include="System.Reactive.Interfaces" Version="$(SystemReactiveVersion)" />
+  </ItemGroup>
+  <ItemGroup Condition="'$(TargetFramework)' == 'net451' Or '$(TargetFramework)' == 'net46'">
     <Reference Include="System" />
     <Reference Include="System.Core" />
     <Reference Include="System.Xml" />
-    <PackageReference Include="protobuf-net" Version="$(ProtobufVersion)" />
-    <PackageReference Include="EnterpriseLibrary.TransientFaultHandling.Core" Version="$(TransientFaultHandlingVersion)" />
-    <PackageReference Include="System.Reactive.Interfaces" Version="$(SystemReactiveVersion)" />
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\Org.Apache.REEF.Tang\Org.Apache.REEF.Tang.DotNet.csproj" />
diff --git a/lang/cs/build.DotNet.props b/lang/cs/build.DotNet.props
index 6b1d9e4..10e2c17 100644
--- a/lang/cs/build.DotNet.props
+++ b/lang/cs/build.DotNet.props
@@ -34,6 +34,7 @@
   </PropertyGroup>
 
   <PropertyGroup>
+    <Platforms>x64</Platforms>
     <PlatformTarget>x64</PlatformTarget>
     <DefineConstants>DOTNET_BUILD</DefineConstants>
     <OutputPath>..\bin\$(AssemblyName)</OutputPath>
diff --git a/lang/cs/build.DotNetApp.props b/lang/cs/build.DotNetApp.props
new file mode 100644
index 0000000..120dfc6
--- /dev/null
+++ b/lang/cs/build.DotNetApp.props
@@ -0,0 +1,24 @@
+<Project>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<Import Project="build.DotNet.props"/>
+<PropertyGroup>
+  <TargetFrameworks>netcoreapp2.0;net46;net451</TargetFrameworks>
+  <TargetFrameworks Condition="'$(OS)' != 'Windows_NT'">netcoreapp2.0</TargetFrameworks>
+</PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/lang/cs/build.DotNetLibrary.props b/lang/cs/build.DotNetLibrary.props
new file mode 100644
index 0000000..8df151e
--- /dev/null
+++ b/lang/cs/build.DotNetLibrary.props
@@ -0,0 +1,24 @@
+<Project>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<Import Project="build.DotNet.props"/>
+<PropertyGroup>
+  <TargetFrameworks>netstandard2.0;net46;net451</TargetFrameworks>
+  <TargetFrameworks Condition="'$(OS)' != 'Windows_NT'">netstandard2.0</TargetFrameworks>
+</PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/lang/cs/xunit.DotNet.props b/lang/cs/xunit.DotNet.props
index b866911..a08dd54 100644
--- a/lang/cs/xunit.DotNet.props
+++ b/lang/cs/xunit.DotNet.props
@@ -15,15 +15,20 @@
 specific language governing permissions and limitations
 under the License.
 -->
-<ItemGroup>
-    <PackageReference Include="xunit" Version="2.2.0"/>
-    <PackageReference Include="xunit.abstractions" Version="2.0.1"/>
-    <PackageReference Include="xunit.assert" Version="2.2.0"/>
-    <PackageReference Include="xunit.core" Version="2.2.0"/>
-    <PackageReference Include="xunit.extensibility.core" Version="2.2.0"/>
-    <PackageReference Include="xunit.extensibility.execution" Version="2.2.0"/>
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0"/>
-</ItemGroup>
+  <PropertyGroup>
+      <!-- Required check for .net451 test projects to work appropriately -->
+      <DebugType Condition="'$(TargetFramework)' != '' AND !$(TargetFramework.StartsWith('netcoreapp'))">Full</DebugType>
+  </PropertyGroup>
 
+  <ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp2.0' Or '$(TargetFramework)' == 'net46'">
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0" NoWarn="NU1701"/>
+    <PackageReference Include="xunit" Version="2.2.0" NoWarn="NU1701"/>
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" NoWarn="NU1701"/>
+  </ItemGroup>
+  <ItemGroup Condition="'$(TargetFramework)' == 'net451'">
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0" NoWarn="NU1701"/>
+    <PackageReference Include="xunit" Version="2.1.0" NoWarn="NU1701"/>
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.1.0" NoWarn="NU1701"/>
+  </ItemGroup>
 </Project>