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 电子表格?
由 EPPlus 4.1 库以 .xlsx 格式创建的图表未在 openoffice 或 libreoffice 中显示