|
|
|
@ -44,10 +44,9 @@ namespace Grpc.Core.Internal |
|
|
|
|
{ |
|
|
|
|
/// <summary> |
|
|
|
|
/// 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, |
|
|
|
|
/// that library becomes instantly available for <c>DllImport</c> P/Invoke calls referring to the same library name. |
|
|
|
|
/// On Unix systems, dlopen has somewhat different semantics, so we need to use dlsym and <c>Marshal.GetDelegateForFunctionPointer</c> |
|
|
|
|
/// to obtain delegates to native methods. |
|
|
|
|
/// First, the native library is loaded using dlopen (on Unix systems) or using LoadLibrary (on Windows). |
|
|
|
|
/// dlsym or GetProcAddress are then used to obtain symbol addresses. <c>Marshal.GetDelegateForFunctionPointer</c> |
|
|
|
|
/// transforms the addresses into delegates to native methods. |
|
|
|
|
/// See http://stackoverflow.com/questions/13461989/p-invoke-to-dynamically-loaded-library-on-mono. |
|
|
|
|
/// </summary> |
|
|
|
|
internal class UnmanagedLibrary |
|
|
|
|