我也有类似的情况。我使用安装在机器上的 SDK 中的 DLL。我从该 SDK 注册表项中获取 DLL 的目录位置。我在执行用户的 PATH 变量上设置了 DLL 位置(仅临时修改)。基本上,它允许您为要调用的 DLL 设置动态路径,因此不必来自注册表。请注意 PATH 变量是 Windows 查找 DLL 的最后一个位置。但另一方面,它不会改变 Windows 查找 DLL 的其他位置。
例子:
我想在 DLL 上调用的 API:
[DllImport("My.DLL")]
private static extern IntPtr ApiCall(int param);
获取注册表项(您需要使用 Microsoft.Win32;):
private static string GetRegistryKeyPath() {
string environmentPath = null;
using (var rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\SOMENNAME"))
{
if (rk != null)
{
environmentPath = rk.GetValue("Path(or whatever your key is)").ToString();
}
if (string.IsNullOrEmpty(environmentPath))
{
Log.Warn(
string.Format("Path not found in Windows registry, using key: {0}. Will default to {1}",
@"SOFTWARE\SOMETHING", @"C:\DefaultPath"));
environmentPath = @"C:\DefaultPath";
}
}
return environmentPath;
}
在 PATH var 上添加 DLL 的路径(Concat() 在 Linq 中找到):
void UpdatePath(IEnumerable<string> paths){
var path = new[] { Environment.GetEnvironmentVariable("PATH") ?? "" };
path = path.Concat(paths);
string modified = string.Join(Path.PathSeparator.ToString(), path);
Environment.SetEnvironmentVariable("PATH", modified);
}
开始使用 API 调用:
var sdkPathToAdd = GetRegistryKeyPath();
IList<string> paths = new List<string>
{
Path.Combine(sdkPathToAdd),
Path.Combine("c:\anotherPath")
};
UpdatePath(paths);
//Start using
ApiCall(int numberOfEyes);