Bootstrap Uno API LibreOffice exception
Asked Answered
S

3

5

With the following code:

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

I can start Writer of LibreOffice. This works fine with Version 4.4.4 but after installing version 5.0.0 and with new SDK Bootstrap.bootstrap() throws the exception:

"External component has thrown an exception"

Has anyone faced the same problem or some solution? (.NET 4.0, Windows 7 64-bit, LibreOffice 5.0 Lite)

Schlesinger answered 6/8, 2015 at 12:38 Comment(3)
Is there any inner exception on the exception thrown that might contain more information, like which external component originated it?Wheelman
Following is the exception A first chance exception of type 'System.Runtime.InteropServices.SEHException' occurred in cli_cppuhelper.dll cppu.bootstrap(Reference<com::sun::star::uno::XComponentContext>*Schlesinger
This issue is referenced on bug tracker. It confirms that adding C:\Program Files\LibreOffice\program to environment variable "PATH" solves the issue for most people.Mettah
D
8

I have managed to solve the problem by setting the UNO_PATH environment variable before starting the soffice.exe server:

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);

This was required because LibreOffice 5's program directory does not have "URE" subdirectory anymore (previous versions did) which is required for UNO layer.

Desired answered 11/8, 2015 at 8:43 Comment(4)
Thanks, but this solution not always work. I have tested under different Windows versions and on some it work and on some not.Schlesinger
Thanks for the notice, I'm using it on Windows Server 2012 R2, works perfectly. Here is the code: Environment.SetEnvironmentVariable("UNO_PATH", unoPath, EnvironmentVariableTarget.Process); Environment.SetEnvironmentVariable("PATH", Environment.GetEnvironmentVariable("PATH") + @";" + unoPath, EnvironmentVariableTarget.Process);Desired
Thanks it worked perfectly, but only if I have libreoffice 32 bit, with libreoffice 64 bit I still got errors, any suggestion?Plight
@Plight Have you tried to use "Program Files" instead of "Program Files (x86)" for x64 version?Desired
C
5

To get the path to the LibreOffice installation you can ask e.g. the Windows registry. In C# this is smoething like that:

    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]);
        }
    }

Then you can use the answer of Funbit [ https://mcmap.net/q/1899829/-bootstrap-uno-api-libreoffice-exception ]

Chickpea answered 25/5, 2016 at 11:36 Comment(0)
S
0

The most easiest way I found is just copy the URE folder from previous LibreOffice version to LibreOffice 5.

Schlesinger answered 21/8, 2015 at 11:52 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.