Mono-LibreOffice System.TypeLoadException

Dans le passé, j’écrivais une bibliothèque C # pour fonctionner avec OpenOffice et cela fonctionnait bien aussi bien sous Windows que sous Ubuntu avec Mono.
Une partie de cette bibliothèque est publiée ici en tant que réponse acceptée.
Au cours de ces jours, j’ai découvert qu’Ubuntu avait décidé de migrer vers LibreOffice. J’ai donc essayé ma bibliothèque avec la dernière version stable de LibreOffice.
Tandis que sous Windows cela fonctionne parfaitement, sous Linux je reçois cette erreur:

Unhandled Exception: System.TypeLoadException: A type load exception has occurred. [ERROR] FATAL UNHANDLED EXCEPTION: System.TypeLoadException: A type load exception has occurred. 

Habituellement, Mono nous dit quelle bibliothèque ne peut pas être chargée, je peux donc installer le bon paquet et tout va bien, mais dans ce cas, je ne sais vraiment pas ce qui ne va pas.

J’utilise Ubuntu oneiric et ma bibliothèque est compilée avec Framework 4.0.
Sous Windows, je devais écrire ceci dans app.config:

       

parce que les assemblées LibreOffice utilisent Framework 2.0 (je pense).

Comment puis-je trouver la raison de cette erreur pour la résoudre?
Merci

METTRE À JOUR:
Même lors de la compilation avec Framework 2.0, le problème (comme prévu) est identique.
Le problème (je pense) est que Mono ne trouve pas le paquet cli-uno-bridge (installable sur les versions précédentes d’Ubuntu et maintenant marqué comme remplacé), mais je ne peux pas en être sûr.

MISE À JOUR 2:
J’ai créé une application de console de test référençant des dll cli-uno sous Windows (elles sont enregistrées dans GAC_32 et GAC_MSIL).

Application CONSOLE

 static void Main(ssortingng[] args) { Console.WriteLine("Starting"); ssortingng dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); ssortingng 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")); } } 

BIBLIOTHÈQUE:

 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; } } } } 

mais je ne suis pas capable de voir “Démarrage” !!!
Si je commente en utilisant (…) sur l’application, je vois la ligne sur la console … alors je pense que quelque chose ne va pas dans la DLL. Là je ne peux pas voir le message "Entering Init()" sur Init (). Le comportement est le même quand LibreOffice n’est pas installé et quand il l’est !!! try..catch bloc try..catch n’est pas exécuté …
Je commence à penser que mono ne trouve pas les bibliothèques CLI de LibreOffice …
J’ai utilisé updatedb puis locate pour les trouver, mais le résultat est toujours vide. Je ne comprends pas, sous Windows tout fonctionne …

MISE À JOUR 3:
Après le commentaire de Hans, je viens de tout supprimer, sauf Init() dans ma bibliothèque, mais l’erreur est restée. Alors je suis passé à la dynamic

 //private XComponentContext context; //private XMultiServiceFactory service; //private XComponentLoader component; //private XComponent doc; //private List filters = new List(); #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); } } 

et maintenant en console je suis capable de voir

Départ

Exception non gérée: System.IO.FileNotFoundException: impossible de charger le fichier ou l’assembly ‘cli_uretypes, Version = 1.0.8.0, Culture = neutre, PublicKeyToken = ce2cb7e279207b9e’ ou l’une de ses dépendances.

Cela ne résout pas mon problème, mais aide !!
La question est: pourquoi l’installation Linux de LibreOffice (package d’installation + SDK) n’installe-t-elle pas cette bibliothèque?

Je réponds enfin à ma question, mais je tiens à remercier @Hans de m’aider à trouver un problème caché.
Comme je l’ai écrit, en essayant de faire fonctionner une application simple avec Mono avec LibreOffice, j’ai eu cette erreur

Exception non gérée: System.TypeLoadException: une exception de chargement de type s’est produite.
[ERREUR] EXCEPTION FATALE NON GÉRÉE: System.TypeLoadException: une exception de chargement de type s’est produite.

Il n’y avait aucun moyen de laisser Mono me dire quelle était l’erreur, ni que mon application n’écrive quoi que ce soit sur console afin que je puisse comprendre quelle partie / quelle ligne déclencherait l’erreur.
Un paragraphe de la réponse de Hans m’a montré le chemin

Le framework .NET a un vrai compilateur juste à temps. Mono non, il a un compilateur AOT (Ahead Of Time). En d’autres termes, il comstack agressivement tout le code de l’assembly, pas seulement ce qui est sur le point d’être exécuté.

Alors quand je déclare

 private XComponentContext context; private XMultiServiceFactory service; private XComponentLoader component; private XComponent doc; 

Mono essaie de trouver les assemblys référencés directement lorsque l’application est exécutée, et non lorsque ces lignes doivent être traitées! En réfléchissant à cela, j’ai décidé de passer à la dynamic.
J’ai donc supprimé la déclaration de variables et utilisé:

 //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"); 

En exécutant à nouveau mon application, j’ai été en mesure de voir les messages de la console auxquels je m’attendais et, finalement, lorsque la ligne var context = ... été traitée, j’ai reçu

Exception non gérée: System.IO.FileNotFoundException: impossible de charger le fichier ou l’assembly ‘cli_uretypes, Version = 1.0.8.0, Culture = neutre, PublicKeyToken = ce2cb7e279207b9e’ ou l’une de ses dépendances.

J’ai donc finalement réussi à trouver le problème: LibreOffice dans Ubuntu 11.10 n’installe pas le CLI interface package et ce package a été retiré de la dissortingbution actuelle d’Ubuntu.
Même si j’ai essayé d’installer manuellement d’autres paquets plus anciens, même en convertissant certains paquets rpm, je n’ai pas pu utiliser LibreOffice avec Mono.
Dommage, même parce qu’avec la dissortingbution précédente utilisant OpenOffice, un paquetage cli-uno-bridge faisait ce travail. J’espère mieux à l’avenir …
J’ai également essayé de poster une question sur AskUbuntu , mais aucune réponse utile n’a été donnée pour le moment.

Habituellement, Mono nous dit quelle bibliothèque ne peut pas charger

Ce n’est pas le problème, il a trouvé un assemblage avec le nom correct. Le problème est avec le contenu de l’assemblage. Un type qui était présent dans l’assembly de référence que vous avez utilisé n’est pas réellement présent dans l’assembly trouvé lors de l’exécution. Les chances que cela se produise sont plutôt bonnes si vous utilisez Windows et que vous utilisez Linux. Il est censé être évité en donnant à l’assembly une [AssemblyVersion] différente, mais cette règle est parfois ignorée. Microsoft l’a fait par exemple.

L’exception InnerException de l’exception devrait vous dire quel type est manquant. Vous pouvez résoudre ce problème en travaillant en arrière. Utilisez les assemblys LibreOffice que vous avez trouvés / installés sur la machine Linux comme assemblage de référence afin de savoir qu’il existe une correspondance entre l’assemblage de référence et l’exécution. Une erreur de compilation sur le type manquant est maintenant probable. Si le type manquant n’est pas directement référencé dans votre programme mais existe dans un assembly d’assistance, le problème est plus grave.

Mise à jour: soyez prudent en tirant les conclusions de votre méthode Init (). L’exception TypeLoadException est générée par la gigue lorsqu’elle comstack IL en code machine. Le framework .NET a un vrai compilateur juste à temps. Mono non, il a un compilateur AOT (Ahead Of Time). En d’autres termes, il comstack agressivement tout le code de l’assembly, pas seulement ce qui est sur le point d’être exécuté. Ainsi, l’exception peut être déclenchée en raison d’un autre code de l’assembly, pas seulement du code à l’intérieur de Init ().

Bien qu’il ne soit pas facile à comprendre, cette erreur “type load exception” peut être liée à des paquets manquants sur votre machine Linux.

Voir ma réponse sur ce post