У меня была похожая ситуация. Я использую DLL из SDK, который установлен на машине. Я получаю расположение каталога DLL из этого ключа реестра SDK. Я устанавливаю местоположение DLL в переменной PATH исполняющего пользователя (только временная модификация). По сути, он позволяет вам установить динамический путь к той DLL, которую вы хотите вызвать, поэтому он не должен быть из реестра. Имейте в виду, что переменная PATH - это последнее место, где Windows ищет библиотеки DLL. Но, с другой стороны, это не меняет других мест, где Windows ищет библиотеки DLL.
Пример:
API, который я хочу вызвать, в DLL:
[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;
}
Добавьте путь к DLL в переменной PATH (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);