Позднее связывание в дочернем домене приложений (.Net) - PullRequest
0 голосов
/ 01 октября 2010

Я пытаюсь разработать архитектуру плагинов в .Net. Приложение будет приложением .Net. Там будут каталоги, которые содержат плагины. Каждый каталог будет представлять собой плагин. Каждый каталог плагинов также будет содержать все библиотеки зависимостей. Плагины должны храниться в отдельном домене приложений, так как плагины могут использовать одни и те же сборки, но разные версии.

Когда он выполняет цикл foreach в Init (), я получаю System.IO.FileNotFoundException: Не удалось загрузить файл или сборку '[Имя сборки], Версия = 1.0.0.0, Культура = нейтральная, PublicKeyToken = null' или одна из ее зависимостей. Система не может найти указанный файл. в _apDomain.Load () для сборок, которых нет в основном проекте.

Код:

    readonly private AppDomain _appDomain;
    internal ItemModuleAppDomain()
    {
        AppDomainSetup info = AppDomain.CurrentDomain.SetupInformation;
        _appDomain = AppDomain.CreateDomain("ChildDomain");
    }

    public void Init(string dllDir)
    {
        string[] dlls = Directory.GetFiles(dllDir, "*.dll", SearchOption.TopDirectoryOnly);
        foreach(string dll in dlls)
        {
            _appDomain.Load(AssemblyName.GetAssemblyName(dll));
        }

Есть идеи, почему? Я попробовал несколько методов, таких как чтение сборки в виде массива байтов для загрузки.

1 Ответ

0 голосов
/ 01 октября 2010

Я считаю, что AppDomain.Load может быть неправильным методом для вашей цели - он загружает сборку как в текущий домен приложения, так и в целевой домен. И вы получаете ошибку, потому что ваша сборка находится в подпапке, а .NET об этом не знает. Вы должны указать частные пути в конфигурации (http://msdn.microsoft.com/en-us/library/15hyw9x3.aspx). Вы также можете использовать AssemblyResolve или TypeResolve событие AppDomain для разрешения.

Вам также следует взглянуть на метод AppDomain.CreateInstanceFrom , чтобы загрузить основной тип плагина (и содержащий сборку).

...