Упакованный файл Excel ДНК .xll не загружает ленту - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь развернуть надстройку Excel, созданную с использованием инструмента Excel-DNA.

Надстройка отлично работает при запуске из Visual Studio, но, когда я пытаюсь открыть упакованный файл .xll откуда-то еще, как предлагает Говерт (создатель Excel ДНК), плагин ленты не 'т нагрузка.После активации сообщений об ошибках подключаемого модуля я получаю неявное сообщение: Сбой вызова GetCustomUI () .Вот и все.

Итак, у меня есть два вопроса:

  • Есть ли какой-либо способ получить более подробную информацию о плагине в loadingerror, чтобы узнать ПОЧЕМУ сбой вызова (это было бы хорошим началомдля расследования)?
  • Я подозреваю, что ошибка исходит из файла конфигурации / ресурса / значка, который не будет правильно упакован в файл xll.Мой файл AddIn.dna содержит операторы Reference Path = "XXX.dll" Pack = "true" для каждой указанной DLL, но должен ли я объявлять ресурсы?А конфигурационные файлы?

1 Ответ

0 голосов
/ 28 сентября 2019

Как указывает @CaioProiete, Я окружил переопределение метода GetCustomUI () блоком try / catch и записал исключение в текстовый файл.Это дало мне доступ к исключению, возникшему при запуске плагина.

И, в заключение, проблема в том, что у меня был дополнительный файл конфигурации JSON, который не был учтен упакованным XLL, по-видимому, нет простого способа включить его через файл ДНК.

Обходной путь объяснен здесь : установите для внешнего файла значение встроенный ресурс и прочитайте его из потока ресурсов манифеста .

В моем конкретном случае я использовал его в качестве поставщика услуг DI и строю его следующим образом:

private IServiceProvider BuildServiceProvider()
    {
        var serviceCollection = new ServiceCollection();

        //Configuration
        ConfigurationBuilder builder = new ConfigurationBuilder();
        builder.SetBasePath(Directory.GetCurrentDirectory());

        var assembly = Assembly.GetExecutingAssembly();
        var resourceName = "otherconfig.json";
        using (Stream stream = assembly.GetManifestResourceStream(resourceName))
        using (StreamReader reader = new StreamReader(stream)) {
            string result = reader.ReadToEnd();
            string tempPath = Path.GetTempFileName();
            File.WriteAllText(tempPath, result);
            builder.AddJsonFile(tempPath);
        }

        IConfiguration config = builder.Build();
        serviceCollection.AddSingleton(config);

        //other dependency injection service registration

        return serviceCollection.BuildServiceProvider();
    }
...