Merge pull request #4986 from jtattermusch/dlopen_no_dev

Prevent the need to install libc6-dev on Linux to run gRPC C#
pull/5010/head
Jan Tattermusch 9 years ago
commit 71a083b1b1
  1. 7
      src/csharp/Grpc.Core/Internal/PlatformApis.cs
  2. 24
      src/csharp/Grpc.Core/Internal/UnmanagedLibrary.cs

@ -49,6 +49,7 @@ namespace Grpc.Core.Internal
static readonly bool isLinux; static readonly bool isLinux;
static readonly bool isMacOSX; static readonly bool isMacOSX;
static readonly bool isWindows; static readonly bool isWindows;
static readonly bool isMono;
static PlatformApis() static PlatformApis()
{ {
@ -58,6 +59,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);
isMono = Type.GetType("Mono.Runtime") != null;
} }
public static bool IsLinux public static bool IsLinux
@ -75,6 +77,11 @@ namespace Grpc.Core.Internal
get { return isWindows; } get { return isWindows; }
} }
public static bool IsMono
{
get { return isMono; }
}
public static bool Is64Bit public static bool Is64Bit
{ {
get { return IntPtr.Size == 8; } get { return IntPtr.Size == 8; }

@ -91,6 +91,10 @@ namespace Grpc.Core.Internal
{ {
if (PlatformApis.IsLinux) if (PlatformApis.IsLinux)
{ {
if (PlatformApis.IsMono)
{
return Mono.dlsym(this.handle, symbolName);
}
return Linux.dlsym(this.handle, symbolName); return Linux.dlsym(this.handle, symbolName);
} }
if (PlatformApis.IsMacOSX) if (PlatformApis.IsMacOSX)
@ -122,6 +126,10 @@ namespace Grpc.Core.Internal
} }
if (PlatformApis.IsLinux) if (PlatformApis.IsLinux)
{ {
if (PlatformApis.IsMono)
{
return Mono.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)
@ -154,5 +162,21 @@ namespace Grpc.Core.Internal
[DllImport("libSystem.dylib")] [DllImport("libSystem.dylib")]
internal static extern IntPtr dlsym(IntPtr handle, string symbol); internal static extern IntPtr dlsym(IntPtr handle, string symbol);
} }
/// <summary>
/// On Linux systems, using using dlopen and dlsym results in
/// DllNotFoundException("libdl.so not found") if libc6-dev
/// is not installed. As a workaround, we load symbols for
/// dlopen and dlsym from the current process as on Linux
/// Mono sure is linked against these symbols.
/// </summary>
private static class Mono
{
[DllImport("__Internal")]
internal static extern IntPtr dlopen(string filename, int flags);
[DllImport("__Internal")]
internal static extern IntPtr dlsym(IntPtr handle, string symbol);
}
} }
} }

Loading…
Cancel
Save