2012-04-05 4 views
1

이전에는 OpenOffice와 함께 작동하는 C# 라이브러리를 작성했으며 Windows에서 Mono와 함께 우분투보다 잘 작동했습니다.
이 라이브러리의 일부는 답변으로 게시되었습니다. here.
요즘 우분투는 LibreOffice로 이동하기로 결정 했으므로 LibreOffice 최신 안정 릴리스로 라이브러리를 시험해 보았습니다.
윈도우에서 리눅스에서 완벽하게 작동하고있는 동안이 오류가 나타납니다Mono-LibreOffice System.TypeLoadException

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

보통 모노로드 할 수있는 라이브러리를 우리에게 알려줍니다, 그래서 올바른 패키지를 설치하고 모든 것이 OK이지만,를이 경우 I 정말로 나쁜 일이 무엇인지 알지 못합니다.

나는 Ubuntu oneiric을 사용하고 있으며 내 라이브러리는 Framework 4.0으로 컴파일됩니다. 윈도우에서
나는의 app.config에이를 작성했다 :

<?xml version="1.0"?> 
<configuration> 
    <startup useLegacyV2RuntimeActivationPolicy="true"> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/> 
    </startup> 
</configuration> 

때문에 LibreOffice와 어셈블리 프레임 워크 2.0 (내 생각)를 사용합니다.

이 오류의 원인을 어떻게 해결할 수 있습니까?
감사

UPDATE :
에도 동일 (예상대로) 프레임 워크 2.0 문제를 컴파일.
Mono가 cli-uno-bridge 패키지 (이전 우분투 릴리즈에서 설치 가능하고 현재는 대체 됨으로 표시됨)를 찾지 못하고 있지만 확신 할 수 없다는 것이 문제입니다.

UPDATE 2 :
나는 (그들이 GAC_32 및 GAC_MSIL에 등록 된) Windows에서 CLI-우노 DLL을 참조하는 테스트 콘솔 응용 프로그램을 만들었습니다.

콘솔 응용 프로그램

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

LIBRARY :

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 블록은
내가 그들을 찾을 다음 updatedblocate를 사용 ...
내가 모노 LibreOffice와 CLI 라이브러리를 찾을 수 있다고 생각하기 시작 ... 실행,하지만 난 항상 빈 결과를 얻을하지 않습니다; 내 라이브러리에 Init()하지만
한스 주석 후, 난 그냥 삭제 한 모든하지만 오류가 남아 : 윈도우의 모든 작품에 나는 ...,

UPDATE 3을 이해하지 않습니다.그래서

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

동적

로 이동 지금은 콘솔에서 나는

Starting

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'cli_uretypes, Version=1.0.8.0, Culture=neutral, PublicKeyToken=ce2cb7e279207b9e' or one of its dependencies.

이 내 문제를 해결하지만, 도움이되지 않습니다 볼 수 있어요!
질문 : LibreOffice의 Linux 설치 (설치 패키지 + SDK)가이 라이브러리를 설치하지 않는 이유는 무엇입니까?

+0

은 그냥 자신의 대답을 게시를 참조하십시오. –

+0

@HansPassant : 왜 답변을 삭제 했습니까? 그것은 나를 많이 도왔고 좋은 지식이 많이 있습니다. ... – Marco

+0

Meh, 아무도 그것이 도움이된다고 대답하지 않았고 대답을 포함하도록 질문을 업데이트했습니다. 나는 다른 질문을 위해 그것을 구할 것이다 : –

답변

5

나는 마침내 내 질문에 답하지만, 숨겨진 문제를 찾는데 도움을 주신 @Hans에게 감사드립니다. 내가 쓴대로, 모노 LibreOffice와를 사용하여 간단한 응용 프로그램을 실행하려고, 난이 오류가 발생했습니다

모노 오류이고,도 내 애플 콘솔에 아무것도 기록 된 말해 보자 할 방법이 없었다

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

그래서 어떤 부분/줄 오류를 인상 이해할 수 있습니다.
는 한스의 대답에 단락이 나에게 길을 내가

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

모노 응용 프로그램이 실행될 때 바로 참조 된 어셈블리를 찾습니다 선언 그래서

The .NET framework has a true just-in-time compiler. Mono doesn't, it has an AOT (Ahead Of Time) compiler. In other words, it aggressively compiles all the code in the assembly, not just what is about to be executed.

을 보여 주었다, 그 선은하지 않을 때 처리 할 ! 이것에 대해 생각하면서, 나는 역동으로 나아 가기로 결정했습니다. 내가 기대 콘솔 메시지를 볼 수 있었다, 다시는 내 응용 프로그램을 실행

//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 = ... 처리 때 나는

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'cli_uretypes, Version=1.0.8.0, Culture=neutral, PublicKeyToken=ce2cb7e279207b9e' or one of its dependencies.

을 그래서 내가 가진 :
그래서 나는 변수 선언과 사용을 제거 Ubuntu 11.10의 LibreOffice는 CLI interface package을 설치하지 않으며이 패키지는 현재의 Ubuntu 배포에서 제거되었습니다.
rpm 패키지를 변환해도 다른 오래된 패키지를 수동으로 설치하려고해도 Mono와 함께 LibreOffice를 사용할 수 없었습니다.
OpenOffice를 사용한 이전 배포에는이 작업을 수행하는 cli-uno-bridge 패키지가 있었기 때문에 너무 좋지 않습니다. 앞으로 더 나아지기를 바랍니다 ...
나는 AskUbuntu에 질문을 올리려고했지만, 지금은 유용한 대답이 없습니다.

2

Usually Mono tells us which library can't load

올바른 이름의 어셈블리를 찾았습니다. 문제는 어셈블리의 내용입니다. 사용 된 참조 어셈블리에있는 유형은 런타임에 발견 된 어셈블리에 실제로 존재하지 않습니다. Windows에서 빌드하고 Linux에서 실행하는 경우 이런 현상이 발생하는 것은 매우 좋습니다. 어셈블리에 다른 [AssemblyVersion]을 부여하여 방지해야하지만 그 규칙은 때때로 무시됩니다. Microsoft는 예를 들었습니다.

예외의 InnerException은 누락 된 유형을 알려줍니다. 거꾸로 작업하여 해결할 수 있습니다. Linux 컴퓨터에서 찾거나 설치 한 LibreOffice 어셈블리를 참조 어셈블리로 사용하면 참조 어셈블리와 런타임 어셈블리가 일치한다는 사실을 알 수 있습니다. 누락 된 유형의 컴파일 오류가 발생할 가능성이 높습니다. 누락 된 형식이 프로그램에서 직접 참조되지는 않지만 도우미 어셈블리에 있으면 더 큰 문제가 있습니다.

업데이트 : Init() 메소드에서 결론을 내리는 데주의해야합니다. TypeLoadException은 IL을 기계 코드로 컴파일 할 때 지터에 의해 생성됩니다. .NET 프레임 워크는 진정한 Just-In-Time 컴파일러를 가지고 있습니다. Mono는 AOT (Ahead Of Time) 컴파일러를 가지고 있습니다. 즉, 실행하려고하는 것이 아니라 어셈블리의 모든 코드를 적극적으로 컴파일합니다. 따라서 Init() 내부의 코드뿐만 아니라 어셈블리의 다른 코드로 인해 예외가 발생할 수 있습니다.

+0

나는 아직도 어셈블리를로드하지 못하고 어떤 것을 발견 할 수 없다고 생각한다. 내 편집 된 질문을보십시오. 도와 주셔서 감사합니다 한스, 정말 고맙습니다 !! – Marco

+0

답변 됨, 마지막 단락. –

+0

내 질문에 세 번째 업데이트. 감사합니다 한스, 당신은 나를 많이 돕고있어 !! – Marco

1

알 수 있듯이이 "유형로드 예외"오류는 Linux 시스템의 누락 된 패키지에 연결될 수 있습니다.

내 대답 아무도 더 나은 하나와 함께 제공하지 않는 경우 on this post

관련 문제