C # + LibreOffice SDK - PullRequest
       9

C # + LibreOffice SDK

0 голосов
/ 18 октября 2018

Я разрабатываю настольное приложение в .NET (C # + WPF), и мой компьютер работает правильно, я могу сделать вызов LibreOffice, открыть файл и настроить интерфейс во всем моем приложении .NET, но для того, чтобы работать,необходимо, чтобы версия SDK была такой же, как и версия LibreOffice, установленная на машине, а архитектура приложения должна быть такой же, как и у LibreOffice (32 или 64 бита).

Для работыинтеграции, я должен был добавить в ссылки моего проекта DLL, которые поставляются вместе с SDK:

  • cli_basetypes.dll
  • cli_cppuhelper.dll
  • cli_oootypes.dll
  • cli_ure.dll
  • cli_uretypes.dll

Итак, сначала все в порядке, но мой вопрос таков: я разработал приложение с использованием LibreOffice 6.1 вместе сSDK той же версии, и теперь мне нужно, чтобы приложение запускалось на другом компьютере с более низкой версией LibreOffice, которую я не могу получить в настоящее время со следующей ошибкойили происходит:

System.IO.FileNotFoundException: Не удалось загрузить файл или сборку «cli_cppuhelper.dll» или одну из ее зависимостей.Указанный модуль не найден.

Возможно ли запустить приложение на другом компьютере с другой версией LibreOffice?Как?Кроме того, возможно ли избежать ошибок, потому что приложение разработано в 64-битной версии, а установленный LibreOffice, например, 32-битный?

1 Ответ

0 голосов
/ 26 октября 2018

После многих попыток мне удалось решить проблему.

Необходимо было переопределить событие AssemblyResolve, чтобы извлечь библиотеки DLL LibreOffice из GAC (C: \ Windows \ Microsoft.NET \ assembly).

Кроме того, приложение должно работать с той же установленной архитектурой LibreOffice, поэтому было необходимо сгенерировать два исполняемых файла, один 32-битный и другой 64-битный (проверка / снятие флажка свойства проекта «32-bit Preferred»), чтобы событие AssemblyResolveнаходит нужную DLL в GAC.

Еще одно необходимое изменение было необходимо для установки в переменной среды "UNO_PATH", которую можно найти в реестре Windows;

string unoPath = "";
RegistryKey hkcuView32 = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.CurrentUser, RegistryView.Default);
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
{
    RegistryKey hklmView32 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Default);
    RegistryKey hklmUnoInstallPathKey = hklmView32.OpenSubKey(@"SOFTWARE\LibreOffice\UNO\InstallPath", false);
    if (hklmUnoInstallPathKey != null && hklmUnoInstallPathKey.ValueCount > 0)
    {
        unoPath = (string)hklmUnoInstallPathKey.GetValue(hklmUnoInstallPathKey.GetValueNames()[hklmUnoInstallPathKey.ValueCount - 1]);
    }
}

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

После этих шагов мое приложение работало отлично!

...