J'avais une situation similaire. J'utilise les DLL d'un SDK installé sur la machine. Je reçois l'emplacement de répertoire des DLL à partir de cette clé de Registre SDKs. Je définis l'emplacement de la DLL sur la variable PATH des utilisateurs en cours d'exécution (modification temporaire uniquement). Fondamentalement, il vous permet de définir un chemin dynamique pour la DLL que vous souhaitez appeler, de sorte qu'il ne doit pas nécessairement provenir du registre. Notez que la variable PATH est le dernier endroit où Windows recherche les DLL. Mais d'un autre côté, cela ne change pas les autres endroits que Windows recherche pour les DLL.
Exemple:
API je veux appeler, sur la DLL:
[DllImport("My.DLL")]
private static extern IntPtr ApiCall(int param);
obtenir la clé de Registre (vous avez besoin l'aide de 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;
}
Ajoutez le chemin de la DLL sur le var PATH (concat() se trouve dans 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);
}
Commencer à utiliser l'appel API:
var sdkPathToAdd = GetRegistryKeyPath();
IList<string> paths = new List<string>
{
Path.Combine(sdkPathToAdd),
Path.Combine("c:\anotherPath")
};
UpdatePath(paths);
//Start using
ApiCall(int numberOfEyes);
Put le chemin dans le registre pendant l'installation et appelez-le avant de charger la DLL. – jmcecil
Je ne vois pas comment cela m'aide, obtenir le chemin de la DLL à l'exécution n'est pas un problème. C'est déclarer la fonction dans le code, en utilisant ce chemin dynamique, que j'essaie de comprendre. –