이전에는 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
블록은
내가 그들을 찾을 다음 updatedb
및 locate
를 사용 ...
내가 모노 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)가이 라이브러리를 설치하지 않는 이유는 무엇입니까?
은 그냥 자신의 대답을 게시를 참조하십시오. –
@HansPassant : 왜 답변을 삭제 했습니까? 그것은 나를 많이 도왔고 좋은 지식이 많이 있습니다. ... – Marco
Meh, 아무도 그것이 도움이된다고 대답하지 않았고 대답을 포함하도록 질문을 업데이트했습니다. 나는 다른 질문을 위해 그것을 구할 것이다 : –