Problema nell'uso della libreria LZO.net

Domanda Problema nell'uso della libreria LZO.net

  • giovedì 12 luglio 2012 08:58
     
     

    Ho scaricato la libreria da http://lzo-net.sourceforge.net/ , ho già usato la dll Simplicit.net.lzo per un plugin di un programma ma usava un proprio linguaggio e non c#.

    Ora che mi sono affacciato a c# sto facendo una mia dll e tra le varie funzioni mi serve proprio questo tipo di compressione. In accordo a quanto scritto nell'esempio io ho creato un nuovo progetto di assembly, ho aggiunto come referenza il file Simplicit.net.lzo, anche se non ho ben capito perchè non è possibile caricare il file lzo.dll ( riguarda il COM o simile, ma la parte della compatibilità tra linguaggio non l'ho saltata perchè non mi interessa al momento).

    Nella stessa soluzione ( c# express 2008) ho creato un nuovo progetto console che testi sia la mia dll che la simplicit.net.lzo , quindi anche quà ho applicato come referenza questo file.

    Il programma test.exe però crasha quando faccio un'instanza di "LZOCompressor". Il debugger mi da un  "System.TypeInitializationException". Sia i file My.dll che Simplicit.net.dll che lzo.dll che test.exe si trovano tutti nella stessa cartella.

Tutte le risposte

  • giovedì 12 luglio 2012 09:10
     
     

    mentre usando http://wallaceturner.com/lzo-for-c non crasha ???? non capisco... la versione a 32bit dovrebbe funzionare comunque anche se ho windows7 64x... 

    Cioè crasha ugualmente ma senza neanche darmi qualche indizio nel debugger....

    • Modificato Johnwhile giovedì 12 luglio 2012 09:33
    •  
  • giovedì 12 luglio 2012 10:03
    Postatore
     
     
    Guarda la InnerException dell'errore, dovresti trovare una spiegazione più precisa del problema.

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • giovedì 12 luglio 2012 11:56
     
     

    Questo è quello che sinteticamente voglio ottenere
    https://dl.dropbox.com/u/47659776/scambio/TestLzo.zip
    deve essere comunque framework 2.0 , la dll scaricata è compilata per framework 1.0 quindi compatibile.
    Il messaggio di errore è:

    System.TypeInitializationException: L'inizializzatore di tipo di 'Simplicit.Net.Lzo.LZOCompressor' ha generato un'eccezione. ---> System.BadImageFormatException: Tentativo di caricare un programma con un formato non corretto. (Eccezione da HRESULT: 0x8007000B)
       in Simplicit.Net.Lzo.LZOCompressor.__lzo_init3()
       in Simplicit.Net.Lzo.LZOCompressor..cctor()
       --- Fine dell'analisi dello stack dell'eccezione interna ---
       in Simplicit.Net.Lzo.LZOCompressor..ctor()
       in MyLibrary.CustomClass..ctor() in C:\Users\PROJECTS\Test\testlibreria\mylib.cs:riga 14
       in concole.Program.Main(String[] args) in C:\Users\PROJECTS\Test\concole\Program.cs:riga 15

    • Modificato Johnwhile giovedì 12 luglio 2012 11:58
    •  
  • giovedì 12 luglio 2012 12:18
     
     

    Di solito ciò accade quando hai una DLL a 32 bit e una macchina a 64 bit o viceversa.

    Per quanto riguarda la lzo.dll guarda qui:
    http://www.codeproject.com/Questions/312339/how-to-use-lzo-dll-in-Csharp

    Qui http://wallaceturner.com/lzo-for-c è chiaro che indichi come abbastanza vecchia la libreria LZO.Net:
    "lzo-net is an existing sourceforge project that wraps the C LZO dll however it is very outdated - the lzo version in that project points at v1.08 and the latest is 2.06"

    Quindi forse ti conviene usare quella oppure guardare qui:
    http://lzohelper.codeplex.com/

  • giovedì 12 luglio 2012 12:59
    Postatore
     
     
    deve essere comunque framework 2.0 , la dll scaricata è compilata per framework 1.0 quindi compatibile.

    E questo in base a cosa lo desumi? .NET 1.0 e 2.0 utilizzano runtime completamente diversi, quindi un'applicazione compilata con .NET 2.0 non può eseguire nello stesso AppDomain un'assembly creato con la versione 1.0.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • giovedì 12 luglio 2012 13:35
     
     

    si ma stiamo girando in tondo... LzoHelper.dll se lo carico come referenza appare un punto esclamativo, dice "non ancora compilato".... e se leggi meglio http://www.codeproject.com/Questions/312339/how-to-use-lzo-dll-in-Csharp questa è un'altra domanda non una risposta.

    I link che mi avete dato li ho già letti tutti. Anche se la libreria è vecchia cosa vuol dire ? che non funzioni più o che comprime decomprime meno efficentemente ?

    C# express 2008 ho letto che compila per tutte e due le versioni, non ha lo switch per passare da " Any cpu" "x64" o "x32"... cioè, in soldoni, il file exe che ho compilato fino adesso funziona sia su win7 64 che su winXP 32


    • Modificato Johnwhile giovedì 12 luglio 2012 13:36
    •  
  • giovedì 12 luglio 2012 13:55
    Postatore
     
     
    Anche se la libreria è vecchia cosa vuol dire ?

    Te l'ho spiegato nel mio ultimo post... Vuol dire che non la puoi usare con .NET 2.0.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • giovedì 12 luglio 2012 14:23
     
     

    Ciao Marco,

    You wrote on 12/07/2012 :

    E questo in base a cosa lo desumi? .NET 1.0 e 2.0 utilizzano runtime completamente diversi, quindi un'applicazione compilata con .NET 2.0 non può eseguire nello stesso AppDomain un'assembly creato con la versione 1.0.

    il CLR della 2.0 è perfettamente in grado di eseguire un assembly compilato per la 1.0.

    Il problema sembra più che altro che l'OP sta cercando ddi caricare una dll compilata a 32 bit in un processo in escuzione a 64bit (o viceversa) cosa ovviamente non lecita.

    .m



    blog @ //milestone.topics.it
  • giovedì 12 luglio 2012 14:34
     
     

    Ho dato un'occhiata al sito che hai postato relativamente a quanto fatto dalla persona per portare la libreria LZO nella versione più recente a funzionare in .Net, indica che ha aggiunto una reference ad una DLL com che deve essere installata sul sistema per funzionare.

    Presumo che tu abbia fatto il download del suo progetto (che risalendo al novembre 2011 dovrebbe funzionare sulle versioni attuali del framework) e abbia compilato il progetto di test, io cerco di non utilizzare mai dll com se posso evitarlo, ma so che a volte è necessario,

    siccome si fa cenno a due versioni, una x86 e una x64 ti chiedo, hai compilato la tua dll con la modalità AnyCPU oppure hai forzato la compilazione a 32 bit del progetto.

    A me è successo con dei componenti esterni di dover scegliere per forza la compilazione a 32 o 64 bit per far funzionare correttamente una DLL.

    fai una verifica in questo senso.

    saluti


    Sabrina

  • giovedì 12 luglio 2012 14:42
    Postatore
     
     

    il CLR della 2.0 è perfettamente in grado di eseguire un assembly compilato per la 1.0.

    Hai ragione, chiedo venia, avevo fatto una prova per verificare questa cosa ma avevo commesso un errore nel mio progetto.

    Grazie per la precisazione.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • giovedì 12 luglio 2012 20:50
     
     

    purtroppo avevo disistallato Visual Studio per optare su C# express 2008, mi sono accorto che sia il 2008 che 2005 non hanno queste opzioni, non sò cosa comporti ma mi sono accorto che la libreria viene caricata sia su 3dstudio max 64 che 32.

    La libreria scaricata da http://wallaceturner.com/lzo-for-c invece non fà crashare il programma compilato quando faccio un'instanza della classe LZOCompressor e quando proco a comprimere, crasha solo per la decompressione ma penso sia dovuto ad un mio problema di dati.

    Comunque a me interessa la prima versione, quella vecchia, proprio perchè precedentemente riuscivo ad eseguirla tramite 3dstudio max 64 & 32, ma per ovvi problemi di efficenza sono passato interamente alla soluzione di fare interamente lo script tramite dll .net

  • venerdì 13 luglio 2012 06:30
     
     

    Solo un osservazione, è strettamente indispensabile per la tua applicazione utilizzare LZO per la compressione dati?

    Io utilizzo SharpZLib che trovi qui http://www.icsharpcode.net/OpenSource/SharpZipLib/

    ed è sviluppata in .Net.

    saluti

    Sabrina


    Sabrina

  • venerdì 13 luglio 2012 12:27
     
     

    SI perchè devo decomprimere dei dati che usano quel metodo...

    Allora io ho compilato sul mio vecchio windowsXP 32 , e tutto funziona, nel senso che mi decomprimere anche dati random. Allora torno su win7 64 , cerco l'opzione per compilare su piattaforma x84 (l'avevano nascosta veramente bene), metto tutti i progetti con questa opzioni, avvio un semplicie test e funziona, avvio il programma che mi decomprime dei dati giusti e crasha...


  • venerdì 13 luglio 2012 13:48
     
     

    Crasha con lo stesso problema?

    oppure l'exception è diversa?

    saluti


    Sabrina C. www.dotnetwork.it

  • venerdì 13 luglio 2012 14:17
     
     

    typeinizializationexception ecc.... non mi ricordo com'era.

    Allora questo test in allegato , compilato con l'opzione x86, funziona nel senso che non crasha ma non conclude, penso sia colpa dell'algorithmo. Nella "Big solution" che ho fatto invece crasha ma in quel caso ho creato due "progetti" , uno che mi compila una mialibreria.dll , e l'altro crea una eseguibile che la testa (test.exe) quindi in questo progetto metto la referenza al progetto precedente (e viasual c# mi collega la mialibreria.dll).

    Crasha se collego anche in quest'ultimo progetto la stessa Simlicit.net.lzo.dll + lzo.dll e inizializzo un'instanza LZOcompressor, forse gli crea confusione ??? boh.

    Questo test funziona ma non completa, il bello che per altri dati funziona. I dati provengono da dei file di animazione di un gioco, quindi penso tutti i file dello stesso hanno lo stesso metodo.

    https://dl.dropbox.com/u/47659776/scambio/test.zip

    OFFTOPIC: qualc'uno se ne intende di algorithmi lossless dictionary ? perchè si tratta di uno appartenente a questa famiglia , ho avuto successo con LZ0-X1 perchè ho decompresso altri file di estensione .pack dello stesso gioco, quindi suppongo sia utilizzato anche per altri file.


    • Modificato Johnwhile venerdì 13 luglio 2012 14:18
    •  
  • venerdì 13 luglio 2012 14:56
     
     

    Prova a verificare di non avere dei reference a diverse versioni della libreria, ad esempio se su un progetto ti è rimasta la versione vecchia e per sfiga quando crea l'exe si copia quella invece di quella corretta,magari un controllino aiuta. Inoltre, se non hai tutto compilato in x86, puoi provare a fare un test compilando tutto a 32 bit e rifare il test sulla libreria full. Se il test funziona è ragionevole pensare che fatto salvo qualche bacherozzo nel codice della libreria full lzo debba funzionare.

    saluti


    Sabrina C. - http://www.dotnetwork.it

  • venerdì 13 luglio 2012 21:02
     
      Contiene codice

    con dependency walker ho estratto il nome di una funzione (lzox1_decompress_safe) che mi decomprime qualche blocco di dati responsabili del crash, comunque questa cosa del 32 e 64 mi crea solo confusione.

    1. Se la dll scritta in ANSI C è compilata con 32 la posso caricare in un progetto a 64 ? il file LZOcompressor.cs che uso per caricare le funzioni dalla dll sinteticamente è

    #region Dll-Imports
    [DllImport("lzo.dll")]
    private static extern int __lzo_init3();
    [DllImport("lzo.dll")]
    private static extern string lzo_version_string();
    [DllImport("lzo.dll")]
    private static extern string lzo_version_date();
    [DllImport("lzo.dll")]
    private static extern int lzo1x_1_compress(byte[] src,int src_len,byte[] dst,ref int dst_len, byte[] wrkmem);
    [DllImport("lzo.dll")]
    private static extern int lzo1x_decompress_safe(byte[] src,int src_len,byte[] dst,ref int dst_len,byte[] wrkmem);
    [DllImport("lzo.dll")]
    private static extern int lzo1x_decompress(byte[] src, int src_len, byte[] dst, ref int dst_len, byte[] wrkmem);		
    #endregion
    

    2. se carico una dll.net (ossia tutto quello che ho scritto transformato in dll e compilato con c#) in 3dstudio attraverso un linguaggio suo interno in grado di caricare dotnet con framework dal 2.0 a 3.5 , no 4.0 almeno per la versione che ho io, devo compilarlo in 64 per la versine di 3dstudio x64 ?

    tutto si basa sulla lzo.dll