Skip to content
Snippets Groups Projects
  • Jon Skeet's avatar
    3fcd20fb
    Overhaul how the native extension is found, loaded and used · 3fcd20fb
    Jon Skeet authored
    The goal of this is to fix #7230.
    
    The changes here are:
    
    - The layout in the nuget package; the files are now in
      `/runtimes/{os}/native/{library}`
    - The filename of each library, which now includes the architecture,
      e.g `grpc_csharp_ext.x64.dll`
    - The targets file used to copy those files in msbuild-based projects;
      note that we now don't build up a folder structure.
    - The way the functions are found
    
    Before this change, on Linux and OSX we used to find library symbols
    manually, and use DllImport on Windows. With this change, the name
    of the library file changes based on architecture, so `DllImport`
    doesn't work. Instead, we have to use `GetProcAddress` to fetch the
    function. This is further convoluted by the convention on
    Windows-x86 to prefix the function name with `_` and suffix it based
    on the stack size of the arguments. We can't easily tell the
    argument size here, so we just try 0, 4, 8...128. (128 bytes should
    be enough for anyone.) This is inefficient, but it's a one-time hit
    with a known number of functions, and doesn't seem to have any
    significant impact.
    
    The benefit of this in code is we don't need the DllImports any
    more, and we don't need to conditionally use `FindSymbol` - we just
    use it for everything, so things are rather more uniform and tidy.
    
    The further benefit of this is that the library name is no longer
    tied to a particular filename format - so if someone wanted to have
    a directory with the libraries for every version in, with the
    version in the filename, we'd handle that just fine. (At least once
    
    Testing:
    
    - Windows:
      - Console app under msbuild, dotnet cli and DNX
      - ASP.NET Classic under msbuild
      - ASP.NET Core (still running under net451)
    - Ubuntu 16.04
      - Console app under dotnet cli, run with dotnet run and mono
    - OSX:
      - Console app under dotnet cli, run with dotnet run and mono
    
    Under dotnet cli, a dependency on `Microsoft.NETCore.Platforms` is
    required in order to force the libraries to be copied.
    
    This change does *not* further enable .NET Core. It attempts to
    keep the existing experimental .NET Core project files in line
    with the msbuild files, but I expect further work to be required
    for .NET Core, which has a different build/publication model.
    3fcd20fb
    History
    Overhaul how the native extension is found, loaded and used
    Jon Skeet authored
    The goal of this is to fix #7230.
    
    The changes here are:
    
    - The layout in the nuget package; the files are now in
      `/runtimes/{os}/native/{library}`
    - The filename of each library, which now includes the architecture,
      e.g `grpc_csharp_ext.x64.dll`
    - The targets file used to copy those files in msbuild-based projects;
      note that we now don't build up a folder structure.
    - The way the functions are found
    
    Before this change, on Linux and OSX we used to find library symbols
    manually, and use DllImport on Windows. With this change, the name
    of the library file changes based on architecture, so `DllImport`
    doesn't work. Instead, we have to use `GetProcAddress` to fetch the
    function. This is further convoluted by the convention on
    Windows-x86 to prefix the function name with `_` and suffix it based
    on the stack size of the arguments. We can't easily tell the
    argument size here, so we just try 0, 4, 8...128. (128 bytes should
    be enough for anyone.) This is inefficient, but it's a one-time hit
    with a known number of functions, and doesn't seem to have any
    significant impact.
    
    The benefit of this in code is we don't need the DllImports any
    more, and we don't need to conditionally use `FindSymbol` - we just
    use it for everything, so things are rather more uniform and tidy.
    
    The further benefit of this is that the library name is no longer
    tied to a particular filename format - so if someone wanted to have
    a directory with the libraries for every version in, with the
    version in the filename, we'd handle that just fine. (At least once
    
    Testing:
    
    - Windows:
      - Console app under msbuild, dotnet cli and DNX
      - ASP.NET Classic under msbuild
      - ASP.NET Core (still running under net451)
    - Ubuntu 16.04
      - Console app under dotnet cli, run with dotnet run and mono
    - OSX:
      - Console app under dotnet cli, run with dotnet run and mono
    
    Under dotnet cli, a dependency on `Microsoft.NETCore.Platforms` is
    required in order to force the libraries to be copied.
    
    This change does *not* further enable .NET Core. It attempts to
    keep the existing experimental .NET Core project files in line
    with the msbuild files, but I expect further work to be required
    for .NET Core, which has a different build/publication model.