diff options
-rw-r--r-- | src/csharp/Grpc.Core/Internal/PlatformApis.cs | 11 | ||||
-rw-r--r-- | src/csharp/Grpc.Core/Internal/UnmanagedLibrary.cs | 22 | ||||
-rw-r--r-- | tools/dockerfile/distribtest/csharp_ubuntu1404_x64/Dockerfile | 4 |
3 files changed, 33 insertions, 4 deletions
diff --git a/src/csharp/Grpc.Core/Internal/PlatformApis.cs b/src/csharp/Grpc.Core/Internal/PlatformApis.cs index 15391ddc64..406204e0a7 100644 --- a/src/csharp/Grpc.Core/Internal/PlatformApis.cs +++ b/src/csharp/Grpc.Core/Internal/PlatformApis.cs @@ -50,6 +50,7 @@ namespace Grpc.Core.Internal static readonly bool isMacOSX; static readonly bool isWindows; static readonly bool isMono; + static readonly bool isNetCore; static PlatformApis() { @@ -57,6 +58,7 @@ namespace Grpc.Core.Internal isLinux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux); isMacOSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX); isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + isNetCore = RuntimeInformation.FrameworkDescription.StartsWith(".NET Core"); #else var platform = Environment.OSVersion.Platform; @@ -64,6 +66,7 @@ namespace Grpc.Core.Internal isMacOSX = (platform == PlatformID.Unix && GetUname() == "Darwin"); isLinux = (platform == PlatformID.Unix && !isMacOSX); isWindows = (platform == PlatformID.Win32NT || platform == PlatformID.Win32S || platform == PlatformID.Win32Windows); + isNetCore = false; #endif isMono = Type.GetType("Mono.Runtime") != null; } @@ -88,6 +91,14 @@ namespace Grpc.Core.Internal get { return isMono; } } + /// <summary> + /// true if running on .NET Core (CoreCLR), false otherwise. + /// </summary> + public static bool IsNetCore + { + get { return isNetCore; } + } + public static bool Is64Bit { get { return IntPtr.Size == 8; } diff --git a/src/csharp/Grpc.Core/Internal/UnmanagedLibrary.cs b/src/csharp/Grpc.Core/Internal/UnmanagedLibrary.cs index dc629bd714..0b934f823b 100644 --- a/src/csharp/Grpc.Core/Internal/UnmanagedLibrary.cs +++ b/src/csharp/Grpc.Core/Internal/UnmanagedLibrary.cs @@ -114,6 +114,10 @@ namespace Grpc.Core.Internal { return Mono.dlsym(this.handle, symbolName); } + if (PlatformApis.IsNetCore) + { + return CoreCLR.dlsym(this.handle, symbolName); + } return Linux.dlsym(this.handle, symbolName); } if (PlatformApis.IsMacOSX) @@ -149,6 +153,10 @@ namespace Grpc.Core.Internal { return Mono.dlopen(libraryPath, RTLD_GLOBAL + RTLD_LAZY); } + if (PlatformApis.IsNetCore) + { + return CoreCLR.dlopen(libraryPath, RTLD_GLOBAL + RTLD_LAZY); + } return Linux.dlopen(libraryPath, RTLD_GLOBAL + RTLD_LAZY); } if (PlatformApis.IsMacOSX) @@ -215,5 +223,19 @@ namespace Grpc.Core.Internal [DllImport("__Internal")] internal static extern IntPtr dlsym(IntPtr handle, string symbol); } + + /// <summary> + /// Similarly as for Mono on Linux, we load symbols for + /// dlopen and dlsym from the "libcoreclr.so", + /// to avoid the dependency on libc-dev Linux. + /// </summary> + private static class CoreCLR + { + [DllImport("libcoreclr.so")] + internal static extern IntPtr dlopen(string filename, int flags); + + [DllImport("libcoreclr.so")] + internal static extern IntPtr dlsym(IntPtr handle, string symbol); + } } } diff --git a/tools/dockerfile/distribtest/csharp_ubuntu1404_x64/Dockerfile b/tools/dockerfile/distribtest/csharp_ubuntu1404_x64/Dockerfile index 1f9a42e13f..ed6d87b228 100644 --- a/tools/dockerfile/distribtest/csharp_ubuntu1404_x64/Dockerfile +++ b/tools/dockerfile/distribtest/csharp_ubuntu1404_x64/Dockerfile @@ -54,7 +54,3 @@ RUN mkdir warmup \ && dotnet new \ && cd .. \ && rm -rf warmup - -# TODO(jtattermusch): without libc-dev, netcoreapp1.0 targets fail with -# System.DllNotFoundException: Unable to load DLL 'libdl.so' -RUN apt-get install -y libc-dev
\ No newline at end of file |