Загрузить пользовательскую сборку в диалоге

Я использую пользовательский диалог в проекте консольного приложения установки wixsharp.

Я ссылался на 2 сборки, которые я хочу использовать в пользовательском диалоге. Каждый раз, когда диалог загружается, он пытается загрузить сборки, но не удается. Дается ошибка, что файлы не найдены.

Можно ли даже загрузить пользовательские сборки в пользовательском диалоговом окне и как это сделать?

1 ответ

Я считаю, что EmbeddedAssemblyкласс - это то, что вам нужно использовать. Он встраивает сборку непосредственно в файл MSI специально для использования в настраиваемых действиях.

Я не нашел никаких подходящих методов, как заставить это работать. Я пытался добавить:

new ManagedProject("Setup", 
   new Binary(new Id("INIFileParser"), "INIFileParser.dll") { IsAssembly = true });

Но мне не повезло. Итак, я использовал самый простой обходной путь:

  1. Добавлены во встроенный файл ресурсов все необходимые сборки:

  1. Добавлен обработчик AssemblyResolve, и когда моя сборка не найдена, я ловлю ее и загружаю сборку из ресурсов.

    private static readonly IDictionary<string, byte[]> NameToAssemblyResourceMap = new Dictionary<string, byte[]>
    {
        {"ObjectListView", Resources.ObjectListView},
        {"INIFileParser", Resources.INIFileParser},
        {"Microsoft.Web.Administration", Resources.Microsoft_Web_Administration }
    };
...
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
    foreach (var pair in NameToAssemblyResourceMap)
    {
        if (args.Name.Contains(pair.Key))
        {
            return Assembly.Load(pair.Value);
        }
    }

    var message = string.Format("Assembly not founded {0}", args.Name);
    MessageBox.Show(message, "Error", MessageBoxButtons.OK);
    Shell.Exit();
    return null;
};

Другие вопросы по тегам