私も同じような状況でした。マシンにインストールされている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変数に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);