过去,我编写了一个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/

10-11 22:04