过去,我编写了一个 C# 库来与 OpenOffice 一起使用,它在 Windows 中运行良好,而不是在带有 Mono 的 Ubuntu 下运行。
该库的一部分在此处作为已接受的答案发布。
这几天我发现 Ubuntu 决定迁移到 LibreOffice,所以我用 LibreOffice 最新的稳定版本尝试了我的库。
虽然在 Windows 下它运行良好,但在 Linux 下我收到此错误:
Unhandled Exception: System.TypeLoadException: A type load exception has occurred.
[ERROR] FATAL UNHANDLED EXCEPTION: System.TypeLoadException: A type load exception has occurred.
通常 Mono 会告诉我们哪个库无法加载,所以我可以安装正确的包并且一切正常,但在这种情况下我真的不知道出了什么问题。
我正在使用Ubuntu oneiric
并且我的库是用 Framework 4.0 编译的。
在 Windows 下,我必须将其写入 app.config:
<?xml version="1.0"?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/>
</startup>
</configuration>
因为 LibreOffice 程序集使用 Framework 2.0(我认为)。
我怎样才能找到这个错误的原因来解决它?
谢谢
更新:
即使使用 Framework 2.0 问题(如预期)进行编译也是一样的。
问题(我认为)是 Mono 没有找到cli-uno-bridge
软件包(可安装在以前的 Ubuntu 版本上,现在标记为已被取代),但我不能确定。
更新 2:
我在 Windows 上创建了一个引用 cli-uno dll 的测试控制台应用程序(它们在 GAC_32 和 GAC_MSIL 中注册)。
控制台应用程序
static void Main(string[] args)
{
Console.WriteLine("Starting");
string dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string doc = Path.Combine(dir, "Liberatoria siti web.docx");
using (QOpenOffice.OpenOffice oo = new QOpenOffice.OpenOffice())
{
if (!oo.Init()) return;
oo.Load(doc, true);
oo.ExportToPdf(Path.ChangeExtension(doc, ".pdf"));
}
}
图书馆:
using unoidl.com.sun.star.lang;
using unoidl.com.sun.star.uno;
using unoidl.com.sun.star.container;
using unoidl.com.sun.star.frame;
using unoidl.com.sun.star.beans;
using unoidl.com.sun.star.view;
using unoidl.com.sun.star.document;
using System.Collections.Generic;
using System.IO;
using System;
namespace QOpenOffice
{
class OpenOffice : IDisposable
{
private XComponentContext context;
private XMultiServiceFactory service;
private XComponentLoader component;
private XComponent doc;
public bool Init()
{
Console.WriteLine("Entering Init()");
try
{
context = uno.util.Bootstrap.bootstrap();
service = (XMultiServiceFactory)context.getServiceManager();
component = (XComponentLoader)service.createInstance("com.sun.star.frame.Desktop");
XNameContainer filters = (XNameContainer)service.createInstance("com.sun.star.document.FilterFactory");
return true;
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
if (ex.InnerException != null)
Console.WriteLine(ex.InnerException.Message);
return false;
}
}
}
}
但我看不到“开始”!
如果我在应用程序上评论 using(...) ,我会在控制台上看到一行...所以我认为 DLL 有问题。我"Entering Init()"
在 Init() 上看不到消息。未安装 LibreOffice 和安装 LibreOffice 时的行为是相同的!!!try..catch
块未执行...
我开始认为mono找不到LibreOffice CLI库...
我使用updatedb
然后locate
找到它们,但我总是得到一个空的结果;我不明白,在 Windows 上一切正常...
更新 3:
汉斯发表评论后,我刚刚删除了所有内容,但Init()
在我的库中,但错误仍然存在。所以我搬到了动态
//private XComponentContext context;
//private XMultiServiceFactory service;
//private XComponentLoader component;
//private XComponent doc;
//private List<string> filters = new List<string>();
#region Constructors
public OpenOffice()
{
Console.WriteLine("Entering Init()");
try
{
var context = uno.util.Bootstrap.bootstrap();
var service = (XMultiServiceFactory)context.getServiceManager();
var component = (XComponentLoader)service.createInstance("com.sun.star.frame.Desktop");
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
if (ex.InnerException != null)
Console.WriteLine(ex.InnerException.Message);
}
}
现在在控制台中我可以看到
开始
未处理的异常:System.IO.FileNotFoundException:无法加载文件或程序集 'cli_uretypes,Version=1.0.8.0,Culture=neutral,PublicKeyToken=ce2cb7e279207b9e' 或其依赖项之一。
这不能解决我的问题,但有帮助!
问题是:为什么LibreOffice的Linux安装(安装包+SDK)没有安装这个库?