过去,我编写了一个C#库来与OpenOffice一起使用,这在Windows中都比在具有Mono的Ubuntu中都可以。
该库的一部分被发布为here作为可接受的答案。
这些天来,我发现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;
}
}
}
}
但我看不到“开始”!
如果我在应用程序上使用(...)进行评论,我会在控制台上看到一行...因此,我认为DLL中有问题。我在Init()上看不到
"Entering Init()"
消息。当未安装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,版本= 1.0.8.0,文化=中性,
PublicKeyToken = ce2cb7e279207b9e”或其依赖项之一。
这不能解决我的问题,但是可以帮助!
问题是:为什么LibreOffice的Linux安装(安装包+ SDK)没有安装该库?
最佳答案
我终于回答了我的问题,但是我要感谢@Hans帮助我发现隐藏的问题。
如我所写,尝试使用LibreOffice与Mono运行一个简单的应用程序时,出现了此错误
未处理的异常:System.TypeLoadException:类型加载异常
已经发生了。
[错误]致命异常:
System.TypeLoadException:发生类型加载异常。
没有办法让Mono告诉我这是错误,也没有我的应用程序正在编写任何要控制台的内容,所以我可以理解哪个部分/行引发了错误。
汉斯回答中的一段向我展示了方式
.NET框架具有真正的即时编译器。单声道不,它
有一个AOT(提前)编译器。换句话说,它积极
编译程序集中的所有代码,而不仅仅是将要编译的代码
被执行。
所以当我宣布
private XComponentContext context;
private XMultiServiceFactory service;
private XComponentLoader component;
private XComponent doc;
Mono尝试在执行应用程序时立即查找引用的程序集,而不是在处理这些行时查找!考虑到这一点,我决定继续发展动力。
所以我删除了变量声明并使用:
//private XComponentContext context;
//private XMultiServiceFactory service;
//private XComponentLoader component;
var context = uno.util.Bootstrap.bootstrap();
var service = (XMultiServiceFactory)context.getServiceManager();
var component = (XComponentLoader)service.createInstance(
"com.sun.star.frame.Desktop");
再次执行我的应用程序,我能够看到我期望的控制台消息,最后,当处理第
var context = ...
行时,我得到了未处理的异常:System.IO.FileNotFoundException:无法加载
文件或程序集'cli_uretypes,版本= 1.0.8.0,文化=中性,
PublicKeyToken = ce2cb7e279207b9e”或其依赖项之一。
因此,我终于设法找到问题所在:Ubuntu 11.10中的LibreOffice未安装
CLI interface package
,并且该软件包已从当前的Ubuntu发行版中删除。即使我尝试手动安装其他较旧的软件包,甚至转换了一些rpm软件包,也无法将LibreOffice与Mono一起使用。
太糟糕了,即使以前使用OpenOffice进行发行,也有
cli-uno-bridge
软件包可以完成这项工作。希望以后会更好...我也尝试在AskUbuntu上发布问题,但是目前没有给出有用的答案。
关于c# - Mono-LibreOffice System.TypeLoadException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10029620/