ZstdNet icon indicating copy to clipboard operation
ZstdNet copied to clipboard

System.DllNotFoundException: libzstd

Open owenStarry opened this issue 7 years ago • 2 comments

When I used zstdnet in web applications, it throwed System.DllNotFoundException: libzstd. I review ed the loading native DLL's source code(ExternMethods class) , found a bug that set directory dll error in SetWinDllDirectory method,as follows: var location = Assembly.GetExecutingAssembly().Location; In web application, it will get temporary asp.net files directory, not the native dll directory. I suggest the code modify following: using System.Web; var isWebApplication = false; if(HttpContext.Current!=null){ isWebApplication = true; } var location = string.empty; if(isWebApplication){ //get web application bin direcotry location = $"{System.AppDomain.CurrentDomain.BaseDirectory}bin/"; }else{ location = Assembly.GetExecutingAssembly().Location; }

owenStarry avatar Sep 06 '17 17:09 owenStarry

I found a better way to solve this problem,as following: var location = GetBinPath(); public static string GetBinPath() { string baseDir = AppDomain.CurrentDomain.BaseDirectory;

        // Note RelativeSearchPath can be null even if the doc say something else; don't remove the check
        string searchPath = AppDomain.CurrentDomain.RelativeSearchPath ?? string.Empty;

        string relativeSearchPath = searchPath.Split(';').First();
        string binPath = Path.Combine(baseDir, relativeSearchPath);
        return binPath;
    }

owenStarry avatar Sep 07 '17 02:09 owenStarry

I finally modify SetWinDllDirectory method as following: private static void SetWinDllDirectory() { var path = GetBinPath(); var platform = Environment.Is64BitProcess ? "x64" : "x86"; if (!SetDllDirectory(Path.Combine(path, platform))) Trace.TraceWarning($"{nameof(ZstdNet)}: Failed to set DLL directory to '{path}'"); }

owenStarry avatar Sep 07 '17 03:09 owenStarry