Bootstrap Uno API LibreOffice исключение

Со следующим кодом:

static void Main()
{
    try
    {
        var context = uno.util.Bootstrap.bootstrap();
    }
    catch (Exception ex)
    {
       Console.WriteLine(ex.toString());
    }
}

Я могу запустить Writer из LibreOffice. Это нормально работает с версией 4.4.4, но после установки версии 5.0.0 и нового SDK Bootstrap.bootstrap() выдает исключение:

"External component has thrown an exception"

Кто-нибудь сталкивался с такой же проблемой или каким-то решением? (.NET 4.0, 64-разрядная версия Windows 7, LibreOffice 5.0 Lite)


person Entwickler    schedule 06.08.2015    source источник
comment
Есть ли какое-либо внутреннее исключение для созданного исключения, которое может содержать дополнительную информацию, например, какой внешний компонент его вызвал?   -  person Chris Mantle    schedule 06.08.2015
comment
Ниже приводится исключение. Первое исключение типа 'System.Runtime.InteropServices.SEHException' произошло в cli_cppuhelper.dll cppu.bootstrap (Ссылка ‹com :: sun :: star :: uno :: XComponentContext› *   -  person Entwickler    schedule 06.08.2015
comment
Эта проблема упоминается в системе отслеживания ошибок. Это подтверждает, что добавление C:\Program Files\LibreOffice\program в переменную окружения PATH решает проблему для большинства людей.   -  person Cyril Waechter    schedule 07.04.2018


Ответы (3)


Мне удалось решить проблему, установив переменную среды UNO_PATH перед запуском сервера soffice.exe:

using static System.Environment;

var unoPath = @"C:\Program Files\LibreOffice 5\program"
// when running 32-bit LibreOffice on a 64-bit system, the path will be in Program Files (x86)
// var unoPath = @"C:\Program Files (x86)\LibreOffice 5\program"

SetEnvironmentVariable("UNO_PATH", unoPath, EnvironmentVariableTarget.Process);
SetEnvironmentVariable("PATH", GetEnvironmentVariable("PATH") + @";" + unoPath, EnvironmentVariableTarget.Process);

Это было необходимо, потому что в программном каталоге LibreOffice 5 больше нет подкаталога «URE» (в предыдущих версиях было), необходимого для уровня UNO.

person Funbit    schedule 11.08.2015
comment
Спасибо, но это решение не всегда работает. Я тестировал в разных версиях Windows, и на некоторых он работает, а на некоторых нет. - person Entwickler; 23.09.2015
comment
Спасибо за уведомление, я использую его на Windows Server 2012 R2, отлично работает. Вот код: Environment.SetEnvironmentVariable (UNO_PATH, unoPath, EnvironmentVariableTarget.Process); Environment.SetEnvironmentVariable (PATH, Environment.GetEnvironmentVariable (PATH) + @; + unoPath, EnvironmentVariableTarget.Process); - person Funbit; 24.09.2015
comment
Спасибо, он работал отлично, но только если у меня 32-разрядная версия libreoffice, а с 64-разрядной версией libreoffice у меня все еще есть ошибки, какие-либо предложения? - person Alkampfer; 20.10.2015
comment
@Alkampfer Вы пробовали использовать Program Files вместо Program Files (x86) для версии x64? - person Funbit; 21.10.2015

Чтобы получить путь к установке LibreOffice, вы можете спросить, например, реестр Windows. В C # это сглаживается вот так:

    String unoPath = "";
    // access 32bit registry entry for latest LibreOffice for Current User
    Microsoft.Win32.RegistryKey hkcuView32 = Microsoft.Win32.RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.CurrentUser, Microsoft.Win32.RegistryView.Registry32);
    Microsoft.Win32.RegistryKey hkcuUnoInstallPathKey = hkcuView32.OpenSubKey(@"SOFTWARE\LibreOffice\UNO\InstallPath", false);
    if (hkcuUnoInstallPathKey != null && hkcuUnoInstallPathKey.ValueCount > 0)
    {
        unoPath = (string)hkcuUnoInstallPathKey.GetValue(hkcuUnoInstallPathKey.GetValueNames()[hkcuUnoInstallPathKey.ValueCount - 1]);
    }
    else
    {
        // access 32bit registry entry for latest LibreOffice for Local Machine (All Users)
        Microsoft.Win32.RegistryKey hklmView32 = Microsoft.Win32.RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, Microsoft.Win32.RegistryView.Registry32);
        Microsoft.Win32.RegistryKey hklmUnoInstallPathKey = hklmView32.OpenSubKey(@"SOFTWARE\LibreOffice\UNO\InstallPath", false);
        if (hklmUnoInstallPathKey != null && hklmUnoInstallPathKey.ValueCount > 0)
        {
            unoPath = (string)hklmUnoInstallPathKey.GetValue(hklmUnoInstallPathKey.GetValueNames()[hklmUnoInstallPathKey.ValueCount - 1]);
        }
    }

Затем вы можете использовать ответ Funbit [https://stackoverflow.com/a/31937114/2936206]

person Jens Bornschein    schedule 25.05.2016

Самый простой способ, который я нашел, - это просто скопировать папку URE из предыдущей версии LibreOffice в LibreOffice 5.

person Entwickler    schedule 21.08.2015