Merge pull request #8158 from jtattermusch/no_libc_dev_on_coreclr

Dont require libc-dev on coreclr
pull/8170/head
Jan Tattermusch 8 years ago committed by GitHub
commit 74f355b977
  1. 11
      src/csharp/Grpc.Core/Internal/PlatformApis.cs
  2. 29
      src/csharp/Grpc.Core/Internal/UnmanagedLibrary.cs
  3. 4
      tools/dockerfile/distribtest/csharp_ubuntu1404_x64/Dockerfile

@ -50,6 +50,7 @@ namespace Grpc.Core.Internal
static readonly bool isMacOSX; static readonly bool isMacOSX;
static readonly bool isWindows; static readonly bool isWindows;
static readonly bool isMono; static readonly bool isMono;
static readonly bool isNetCore;
static PlatformApis() static PlatformApis()
{ {
@ -57,6 +58,7 @@ namespace Grpc.Core.Internal
isLinux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux); isLinux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
isMacOSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX); isMacOSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX);
isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
isNetCore = RuntimeInformation.FrameworkDescription.StartsWith(".NET Core");
#else #else
var platform = Environment.OSVersion.Platform; var platform = Environment.OSVersion.Platform;
@ -64,6 +66,7 @@ namespace Grpc.Core.Internal
isMacOSX = (platform == PlatformID.Unix && GetUname() == "Darwin"); isMacOSX = (platform == PlatformID.Unix && GetUname() == "Darwin");
isLinux = (platform == PlatformID.Unix && !isMacOSX); isLinux = (platform == PlatformID.Unix && !isMacOSX);
isWindows = (platform == PlatformID.Win32NT || platform == PlatformID.Win32S || platform == PlatformID.Win32Windows); isWindows = (platform == PlatformID.Win32NT || platform == PlatformID.Win32S || platform == PlatformID.Win32Windows);
isNetCore = false;
#endif #endif
isMono = Type.GetType("Mono.Runtime") != null; isMono = Type.GetType("Mono.Runtime") != null;
} }
@ -88,6 +91,14 @@ namespace Grpc.Core.Internal
get { return isMono; } 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 public static bool Is64Bit
{ {
get { return IntPtr.Size == 8; } get { return IntPtr.Size == 8; }

@ -44,10 +44,9 @@ namespace Grpc.Core.Internal
{ {
/// <summary> /// <summary>
/// Represents a dynamically loaded unmanaged library in a (partially) platform independent manner. /// Represents a dynamically loaded unmanaged library in a (partially) platform independent manner.
/// An important difference in library loading semantics is that on Windows, once we load a dynamic library using LoadLibrary, /// First, the native library is loaded using dlopen (on Unix systems) or using LoadLibrary (on Windows).
/// that library becomes instantly available for <c>DllImport</c> P/Invoke calls referring to the same library name. /// dlsym or GetProcAddress are then used to obtain symbol addresses. <c>Marshal.GetDelegateForFunctionPointer</c>
/// On Unix systems, dlopen has somewhat different semantics, so we need to use dlsym and <c>Marshal.GetDelegateForFunctionPointer</c> /// transforms the addresses into delegates to native methods.
/// to obtain delegates to native methods.
/// See http://stackoverflow.com/questions/13461989/p-invoke-to-dynamically-loaded-library-on-mono. /// See http://stackoverflow.com/questions/13461989/p-invoke-to-dynamically-loaded-library-on-mono.
/// </summary> /// </summary>
internal class UnmanagedLibrary internal class UnmanagedLibrary
@ -114,6 +113,10 @@ namespace Grpc.Core.Internal
{ {
return Mono.dlsym(this.handle, symbolName); return Mono.dlsym(this.handle, symbolName);
} }
if (PlatformApis.IsNetCore)
{
return CoreCLR.dlsym(this.handle, symbolName);
}
return Linux.dlsym(this.handle, symbolName); return Linux.dlsym(this.handle, symbolName);
} }
if (PlatformApis.IsMacOSX) if (PlatformApis.IsMacOSX)
@ -149,6 +152,10 @@ namespace Grpc.Core.Internal
{ {
return Mono.dlopen(libraryPath, RTLD_GLOBAL + RTLD_LAZY); 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); return Linux.dlopen(libraryPath, RTLD_GLOBAL + RTLD_LAZY);
} }
if (PlatformApis.IsMacOSX) if (PlatformApis.IsMacOSX)
@ -215,5 +222,19 @@ namespace Grpc.Core.Internal
[DllImport("__Internal")] [DllImport("__Internal")]
internal static extern IntPtr dlsym(IntPtr handle, string symbol); 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);
}
} }
} }

@ -54,7 +54,3 @@ RUN mkdir warmup \
&& dotnet new \ && dotnet new \
&& cd .. \ && cd .. \
&& rm -rf warmup && 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
Loading…
Cancel
Save