Почему PrivateBinPath при создании нового домена приложений вообще не рассматривается? - PullRequest
0 голосов
/ 11 марта 2019

Поэтому, когда я создаю новый домен приложения, указание PrivateBinPath, похоже, работает неправильно.Я знаю, что это должна быть подпапка базы приложения.Вот пример:

public class PluginHandler : MarshalByRefObject
{
    public void Launch()
    {
        var domainSetup = new AppDomainSetup()
        {
            ApplicationBase = Util.AssemblyDirectory,
            PrivateBinPath = @"Plugins"
        };

        appDomain = AppDomain.CreateDomain(Guid.NewGuid().ToString(), null, domainSetup);
        assemblyLoader = appDomain.CreateInstanceAndUnwrap
            (Assembly.GetExecutingAssembly().FullName, typeof(AssemblyLoader).FullName) as AssemblyLoader;

        thread = new Thread(() => 
            assemblyLoader.LoadAssembly(PluginPath, ProxyBase, this));
        thread.Start();
    }
}

public class AssemblyLoader : MarshalByRefObject
{
    private object pluginObj;
    private MethodInfo pluginStop;

    [HandleProcessCorruptedStateExceptions]
    public bool LoadAssembly(string path, CoreBase proxyBase, PluginHandler pluginHandler)
    {
        var assembly = Assembly.Load(File.ReadAllBytes(path));
        var types = assembly.GetTypes().Where(x => x.IsSubclassOf(typeof(Core))).ToArray();

        for (int i = 0; i < types.Length; i++)
        {
            FieldInfo coreBase = types[i].GetField
                ("proxyBase", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
            MethodInfo pluginRun = types[i].GetMethod("PluginRun");
            pluginStop = types[i].GetMethod("PluginStop");

            if (pluginRun != null)
            {
                pluginObj = assembly.CreateInstance(types[i].FullName);
                coreBase.SetValue(pluginObj, proxyBase);
                pluginHandler.IsLoaded = true;
                pluginHandler.CorePlugin = pluginObj;

                if (!proxyBase.LaunchedPlugins.Contains(pluginHandler))
                {
                    proxyBase.LaunchedPlugins.Add(pluginHandler);
                }

                pluginRun.Invoke(pluginObj, null);

                return true;
            }
        }

        return false;
    }
}

Итак, как вы видите, я загружаю сборку в Proxy для нового домена приложения и загруженную сборку «Плагин».Теперь, всякий раз, когда вызывается PluginRun, я получаю исключение FileNotFound, потому что оно ищет сборку плагина в базовом пути, но в папке плагинов.

Так что даже если указать PrivateBinPath для папки PLugins, похоже, чтобыть в состоянии найти его.

Я использовал Binding Log Viewer, а личный путь - NULL, просто примечание.

Любое решение этой проблемы?Спасибо

...