Я создаю программу, которая использует очень простую систему плагинов. Это код, я использую, чтобы загрузить возможный плагины:Конкретные пути приложения для DLL Загрузка при динамической загрузке DLL
public interface IPlugin
{
string Name { get; }
string Description { get; }
bool Execute(System.Windows.Forms.IWin32Window parent);
}
private void loadPlugins()
{
int idx = 0;
string[] pluginFolders = getPluginFolders();
Array.ForEach(pluginFolders, folder =>
{
string[] pluginFiles = getPluginFiles(folder);
Array.ForEach(pluginFiles, file =>
{
try
{
System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFile(file);
Array.ForEach(assembly.GetTypes(), type =>
{
if(type.GetInterface("PluginExecutor.IPlugin") != null)
{
IPlugin plugin = assembly.CreateInstance(type.ToString()) as IPlugin;
if(plugin != null)
lista.Add(new PluginItem(plugin.Name, plugin.Description, file, plugin));
}
});
}
catch(Exception) { }
});
});
}
Когда пользователь выбирает конкретный плагин из списка, я запускаю Execute метод плагина. Все идет нормально! Как вы можете видеть, плагины загружаются из папки, а внутри папки находятся несколько dll, которые необходимы, но плагин. Моя проблема в том, что я не могу заставить плагин «видеть» DLL, он просто ищет папку запуска запуска приложений, но не папку, в которую был загружен плагин.
Я пробовал несколько способов: 1. Изменение текущего каталога в папку плагинов. 2. С помощью вызова между оп к SetDllDirectory 3. Добавление записи в реестре, чтобы указать папку, где я хочу, чтобы она выглядела (см код ниже)
Ни один из этих методов работы. Что мне не хватает? Когда я загружаю плагин dll динамически, он, похоже, не подчиняется ни одному из вышеупомянутых методов. Что еще я могу попробовать?
С уважением, MartinH.
//HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
Microsoft.Win32.RegistryKey appPaths = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(
string.Format(
@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\{0}",
System.IO.Path.GetFileName(Application.ExecutablePath)),
Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree);
appPaths.SetValue(string.Empty, Application.ExecutablePath);
object path = appPaths.GetValue("Path");
if(path == null)
appPaths.SetValue("Path", System.IO.Path.GetDirectoryName(pluginItem.FileName));
else
{
string strPath = string.Format("{0};{1}", path, System.IO.Path.GetDirectoryName(pluginItem.FileName));
appPaths.SetValue("Path", strPath);
}
appPaths.Flush();
Добавить тег 'plugin' – Pat