過去に、OpenOffice で動作する C# ライブラリを作成しましたが、これは 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 を使用しているためです (私はそう思います)。
このエラーの理由を見つけて解決するにはどうすればよいですか?
ありがとう
更新:
フレームワーク 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がインストールされていない場合とインストールされている場合の動作は同じです!!! try..catch
ブロックが実行されていません...
mono は LibreOffice CLI ライブラリを見つけることができないと思い始めました...
と を使用updatedb
しlocate
てそれらを見つけましたが、常に空の結果が得られます。Windowsではすべてが機能します...
更新 3:
Hans のコメントの後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' またはその依存関係の 1 つを読み込めませんでした。
これは私の問題を解決しませんが、役立ちます!!
質問: LibreOffice の Linux インストール (インストール パッケージ + SDK) でこのライブラリがインストールされないのはなぜですか?