示例#1
0
        internal static void SetupAssemblyFilenames(bool force = false)
        {
            if (FilenameLocations == null || force)
            {
                FilenameLocations = new Dictionary <string, string>();

                foreach (var fn in TraverseTree(LibraryPath, s => s != NativeLibraryPath))
                {
                    if (FilenameLocations.ContainsKey(fn.Name))
                    {
                        Log(Logger.Level.Critical, $"Multiple instances of {fn.Name} exist in Libs! Ignoring {fn.FullName}");
                    }
                    else
                    {
                        FilenameLocations.Add(fn.Name, fn.FullName);
                    }
                }


                if (!SetDefaultDllDirectories(LoadLibraryFlags.LOAD_LIBRARY_SEARCH_USER_DIRS | LoadLibraryFlags.LOAD_LIBRARY_SEARCH_SYSTEM32
                                              | LoadLibraryFlags.LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LoadLibraryFlags.LOAD_LIBRARY_SEARCH_APPLICATION_DIR))
                {
                    var err = new Win32Exception();
                    Log(Logger.Level.Critical, $"Error configuring DLL search path");
                    Log(Logger.Level.Critical, err);
                    return;
                }

                void AddDir(string path)
                {
                    var retPtr = AddDllDirectory(path);

                    if (retPtr == IntPtr.Zero)
                    {
                        var err = new Win32Exception();
                        Log(Logger.Level.Warning, $"Could not add DLL directory");
                        Log(Logger.Level.Warning, err);
                    }
                }

                if (Directory.Exists(NativeLibraryPath))
                {
                    AddDir(NativeLibraryPath);
                    TraverseTree(NativeLibraryPath, dir =>
                    {                  // this is a terrible hack for iterating directories
                        AddDir(dir); return(true);
                    }).All(f => true); // force it to iterate all
                }

                var unityData = Directory.EnumerateDirectories(Environment.CurrentDirectory, "*_Data").First();
                AddDir(Path.Combine(unityData, "Plugins"));

                foreach (var dir in Environment.GetEnvironmentVariable("path").Split(Path.PathSeparator))
                {
                    AddDir(dir);
                }
            }
        }
示例#2
0
 internal static string ResolveDataPath(string installDir) =>
 Directory.EnumerateDirectories(installDir, "*_Data").First();