Is there a way to specify the paths to be searched for a given assembly that is imported with DllImport?
[DllImport("MyDll.dll")]
static extern void Func();
This will search for the dll in the app dir and in the PATH environment variable. But at times the dll will be placed elsewhere. Can this information be specified in app.config or manifest file to avoid dynamic loading and dynamic invocation?
Call SetDllDirectory
with your additional DLL paths before you call into the imported function for the first time.
P/Invoke signature:
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool SetDllDirectory(string lpPathName);
To set more than one additional DLL search path, modify the PATH
environment variable, e.g.:
static void AddEnvironmentPaths(string[] paths)
{
string path = Environment.GetEnvironmentVariable("PATH") ?? string.Empty;
path += ";" + string.Join(";", paths);
Environment.SetEnvironmentVariable("PATH", path);
}
There's more info about the DLL search order here on MSDN.
Updated 2013/07/30:
Updated version of the above using Path.PathSeparator
:
static void AddEnvironmentPaths(IEnumerable<string> paths)
{
var path = new[] { Environment.GetEnvironmentVariable("PATH") ?? string.Empty };
string newPath = string.Join(Path.PathSeparator.ToString(), path.Concat(paths));
Environment.SetEnvironmentVariable("PATH", newPath);
}