It is currently 29 June 2022, 12:44 Advanced search

Importazione Libreria c#

Domande e risposte su come utilizzare Instant Developer Foundation al meglio

Importazione Libreria c#

Postby Gionanni » 17 February 2011, 8:10

Stiamo provando ad importare in inde una semplice libreria composta da una classe. L'importazione avviene solo la libreria è compilata con una versione del Framework.net 4. Comunque, compilata la libreria con il framework .net 3.5, inde mappa ogni proprietà della classe con due metodi (get;set) che però non possono essere utilizzati o meglio l'applicazione inde viene compilata ma a runtime esce questo errore:

Errore di compilazione

Descrizione: Errore durante la compilazione di una risorsa necessaria per soddisfare la richiesta. Rivedere i dettagli relativi all'errore e modificare in modo appropriato il codice sorgente.

Messaggio di errore del compilatore: CS0571: 'IndeLib.test.Op1.set': impossibile chiamare in modo esplicito l'operatore o la funzione di accesso.


La classe c# è banalmente questa:
public class test
{
public int Op1 { get; set; }
public int Op2 { get; set; }
public int Somma()
{
return Op1 + Op2;
}
public int Somma2(int a, int b)
{
Op1 = a;
Op2 = b;
return Somma();
}
}

La procedura NON funzionante in inde è questa;
public voi NuovaVideata.NuovaProcedura()
{
test t = null
t= new()
t.setOp1 (1)
t.SetOp2 (2)
int ris = t.somma()
messageBox(toString(ris))
}

mentre questa funziona
public voi NuovaVideata.NuovaProcedura2()
{
test t = null
t= new()
int ris = t.somma2(1,2)
messageBox(toString(ris))
}
Attachments
IndeLib.zip
Progetto Inde + Libreria
(316.34 KiB) Downloaded 449 times
Gionanni
 
Posts: 133
Joined: 20 January 2011, 9:21

Re: Importazione Libreria c#

Postby r.bianco » 17 February 2011, 12:56

Hai provato a compilare la dll in 2.0? Se non sbaglio un'applicazione fatta da InDe lavora con quella versione.
only work and no play makes jack a dull boy
r.bianco
 
Posts: 4609
Joined: 8 November 2010, 16:46

Re: Importazione Libreria c#

Postby Gionanni » 17 February 2011, 14:58

Sì, ho provato anche compilando in 2.0 ma con lo stesso risultato. Per ora abbiamo bypassato modificando nelle proprietà della funzione importata -> Espressioni della funzione -> .NET Appl:
da new IDVariant($0.get_Op1()) in new IDVariant($0.Op1). in c# non sembra possibile chiamare direttamente i metodi get e set che gestiscono le proprietà...
Gionanni
 
Posts: 133
Joined: 20 January 2011, 9:21

Re: Importazione Libreria c#

Postby lucabaldini » 17 February 2011, 16:34

@Gionanni grazie per la segnalazione...
Colgo l'occasione per spiegare come funziona l'importazione delle classi/DLL. Quando In.de deve importare una classe lancia un apposito comando presente nel framework .NET per "wrapparla" dentro ad una DLL .NET... solo così riesco ad analizzare la classe... L'alternativa sarebbe stata quella di parsare il sorgente... ma ci avrei messo mooooolto di più...e sarebbe stato molto più complicato.

Ora ho una DLL. In.de, a questo punto, lancia un'applicazione in C# da riga di comando chiedendole di "convertire" la DLL in XML. Questa applicazione carica la DLL come modulo esterno e lo analizza utilizzando la reflection. L'applicazione esterna analizza la DLL e produce un file XML che poi fornisce ad In.de. In.de legge il file XML e crea/aggiorna la libreria.

Ho sempre creduto che anche se la mia app esterna in C# è stata compilata con il .NET 2.0 fosse in grado di caricare anche DLL e C# prodotti con la versione 4. Infatti, come anche tu dici, se la compili con il 3.5 funziona... Ora non so esattamente perché se la DLL è compilata con il framework 4 non posso caricarla in una app compilata con il 2.0 ma se la DLL è compilata con il 3.5 riesco a caricarla con il 2.0... Tantè... proverò ad analizzare la cosa... Magari compilando il mio tool con .NET 4 vedo sia 4, sia 3.5 sia 2.0...

Per il problema delle proprietà ci guardo... spero di poter capire tramite reflection se le funzioni get e set che vedo sono, in realtà, delle funzioni fittizie che descrivono una property...
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4877
Joined: 1 October 2010, 17:03
Location: Bologna

Re: Importazione Libreria c#

Postby lucabaldini » 17 February 2011, 21:43

@Gionanni scusami, ti posso chiedere una cortesia? Dato che non ho ancora installato sul mio PC VS2010 mi potresti allegare anche la DLL compilata con .NET 4.0?
Vorrei capire perché non si riesce ad importare... mi è già stato detto da un'altro utente che non funziona l'importazione di DLL compilate con .NET 4.0 e sono curioso :-)

Grazie in anticipo!
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4877
Joined: 1 October 2010, 17:03
Location: Bologna

Re: Importazione Libreria c#

Postby Gionanni » 18 February 2011, 7:23

OK, grazie attendo novità allora!
Per quanto riguarda l'escamotage per le proprietà va bene come abbiamo corretto manualmente o c'è un modo più "elegante" per superare il problema?
Gionanni
 
Posts: 133
Joined: 20 January 2011, 9:21

Re: Importazione Libreria c#

Postby Gionanni » 18 February 2011, 7:29

Ecco la libreria compilata con .NET 4.0
Attachments
IndeLib.rar
(1.8 KiB) Downloaded 439 times
Gionanni
 
Posts: 133
Joined: 20 January 2011, 9:21

Re: Importazione Libreria c#

Postby lucabaldini » 18 February 2011, 20:17

Grazie mille!!! Ora l'importazione dovrebbe essere corretta... Trovi le info relative al miglioramento qui http://doc.progamma.com/?ARTID=606C38EE-3973-4987-80EC-501C34070D36

Ho analizzato il problema di .NET 4.0 e credo sia l'ennesima complicazione informatica... Credo che microsoft, come già aveva fatto anche Sun con Java, abbia rotto la compatibilità in avanti del formato MSIL... Credevo sarebbero riusciti a mantenere la compatibilità per molto tempo, invece mi sbagliavo...
Infatti il mio importatore non riesce a caricare la DLL compilata con la versione 4.0 e genera il seguente errore:

L'assembly non può essere caricato perché è stato creato da un runtime più recente di quello attualmente caricato. (Eccezione da HRESULT: 0x8013101B)

Fino ad ora era possibile usando una applicazione compilata con .NET 2.0 caricare DLL compilate con il .NET 3.5... (infatti come anche hai visto è possibile importare una DLL compilata con .NET 3.5)... purtroppo lo stesso non si può più fare con il framework 4.0! Credo che dovrò provare a compilare l'importatore con .NET 4.0 e verificare che sia in grado di importare DLL 2.0 e 3.5...
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4877
Joined: 1 October 2010, 17:03
Location: Bologna

Re: Importazione Libreria c#

Postby Gionanni » 23 February 2011, 7:55

Ho provato la versione 10 e le proprietà vengono importate correttamente tranne le Collections. Inde le mappa come semplici Objects. Come si può superare il problema?
Per esempio ho in una libreria un metodo che ritorna questo oggetto derivato da CollectionBase:



public class EnvelopeCollection : CollectionBase
{
public EnvelopeCollection();
public Envelope this[int index] { get; }
public void Add(Envelope item);
public void Add(EnvelopeCollection items);
public void Reverse();
}


Questa che segue è la classe che dovrebbe fungere da interfaccia per Inde:

public class ImapInde
{
Imap imp = null;
public string LicenseKey { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public int Port { get; set; }
public string ServerName { get; set; }

public bool Connected { get; set; }

public ArrayList ElencoCartelle { get; set; }


public ImapInde()
{
ElencoCartelle = new ArrayList();
}

public int Connect()
{
Imap.LicenseKey = LicenseKey;// "MN600-AC64644364A6641D644EA0276B03-27B7";// textBoxKey.Text;
imp = new Imap();

imp.Connect(ServerName, Port);
AuthenticationMethods authMethods = false ? AuthenticationMethods.Auto : AuthenticationMethods.Regular;
imp.Login(UserName, Password, authMethods);

CaricaCartelle();

return 0;
}

public int CaricaCartelle()
{
FolderCollection listacartelle = imp.DownloadFolders();

ElencoCartelle.Clear();
foreach (Folder item in listacartelle)
{
ElencoCartelle.Add(item.Name);
}
return ElencoCartelle.Count;
}

public EnvelopeCollection GetMessages(string Cartella, string range)
{
string Range = Imap.AllMessages;

if (range !="")
{
Range = range;
}
imp.SelectFolder(Cartella);

EnvelopeCollection envelopes = imp.DownloadEnvelopes(range, false, EnvelopeParts.MailBeeEnvelope | EnvelopeParts.BodyStructure, 0);

// Make newer messages be displayed first.
envelopes.Reverse();
//FillMessageList(envelopes);

return envelopes;
}



}
Attachments
IMAP Demo 1.zip
Libreria
(13.38 KiB) Downloaded 421 times
MailBee.NET.zip
Progetto .Net di esempio
(328.59 KiB) Downloaded 446 times
Gionanni
 
Posts: 133
Joined: 20 January 2011, 9:21

Re: Importazione Libreria c#

Postby lucabaldini » 8 March 2011, 20:40

Non mi è chiara la cosa... il metodo Imap::DownloadEnvelopes torna una EnvelopeCollection che è anch'essa una classe della libreria... e che quindi va importata come le altre... magari importando i metodi get_Item(int) per ottenere l'Envelope...

In.de non ha una propria libreria CollectionBase (che è la classe base da cui deriva EnvelopeCollection) che quindi andrebbe comunque importata.

In altre parole se vuoi utilizzare il metodo DownloadEnvelopes, devi anche importare la classe EnvelopeCollection (magari solo il metodo get_Item) e la classe Envelope (che di metodi ne ha un bel po' :-)). Se selezioni solo il metodo DownloadEnvelopes In.de importa solo le altre classi correlate ma non ne importa tutti i metodi perché potrebbero essere davvero tanti... Occorre quindi selezionare man-mano tutti gli oggetti collegati scegliendone di volta in volta i metodi necessari.

Qualora l'interfaccia sia davvero complicata ti suggerisco di scrivere una apposita classe c# di interfaccia che esponga verso In.de metodi più semplici. Se, per leggere una e-mail con IMAP, devo importare decine di librerie e centinaia di metodi... forse è meglio immaginare una ulteriore interfaccia che semplifichi l'operazione e, magari, contenga pochi metodi "intelligenti". Per esempio potrebbe contenere un metodo a cui passo il nome della envelope e mi torna una IDCollection già popolata di classi della mia applicazione... così non devo fare altro che prendere quella IDCollection e attaccarla ad un pannello per vederle tutte.

Questo ha parecchi vantaggi:
- Se, un domani, decido di utilizzare una libreria differente posso cambiare la libreria di interfaccia e l'applicazione fatta con In.de non ne risente
- Se devo cambiare tecnologia (es passare a Java), basta trovare una apposita libreria open source che faccia le stesse operazioni e scrivere una nuova interfaccia in java che abbia metodi simili...
- Se aggiorno la libreria esterna posso farmi carico di eventuali variazioni di interfaccia all'esterno.

Tieni conto che potresti anche "wrappare" la libreria con centinaia di metodi in una tua libreria (sempre DLL) con un'interfaccia più semplice o addirittura in un tuo componente... così faresti moooolta meno fatica a riutilizzare il tuo codice anche in applicazioni differenti.
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4877
Joined: 1 October 2010, 17:03
Location: Bologna

Next

Return to Tips & Tricks - Foundation

Who is online

Users browsing this forum: costanzacesanelli and 18 guests