C# + LibreOffice SDK

Posted

技术标签:

【中文标题】C# + LibreOffice SDK【英文标题】: 【发布时间】:2018-10-18 11:03:32 【问题描述】:

我正在使用 .NET (C# + WPF) 开发桌面应用程序,并且我的机器工作正常,我可以通过我的 .NET 应用程序进行 LibreOffice 调用、打开文件和自定义界面,但为了工作, SDK的版本必须与本机安装的LibreOffice版本一致,应用架构与LibreOffice相同(32位或64位)。

为了进行集成,我必须在项目的引用中添加 SDK 附带的 DLL:

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】:

经过多次尝试,我能够解决问题。

必须覆盖 AssemblyResolve 事件以从 GAC (C:\Windows\Microsoft.NET\assembly) 获取 LibreOffice DLL。

此外,应用程序必须在安装相同的 LibreOffice 架构的情况下运行,因此需要生成两个可执行文件,一个 32 位,另一个 64 位(选中/取消选中“32 位首选”项目属性),以便 AssemblyResolve 事件找到GAC 中的正确 DLL。

需要在 Windows 注册表中找到的环境变量“UNO_PATH”中设置另一个必要的更改;

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

完成这些步骤后,我的应用程序完美运行!

【讨论】:

以上是关于C# + LibreOffice SDK的主要内容,如果未能解决你的问题,请参考以下文章

LibreOffice 停止工作,同时使用 C# 应用程序将 XLS 转换为 XHTML 文件

如何使用 C# 和 LibreOffice/OpenOffice 在电子表格单元格中设置粗体文本?

有没有办法像使用 C# 的 MS Office Excel 一样创建/读取 LibreOffice 电子表格?

将文本放入 LibreOffice 文档的程序

由 EPPlus 4.1 库以 .xlsx 格式创建的图表未在 openoffice 或 libreoffice 中显示

怎么把libreoffice改成正常