[c#]Libreria di classi e progetti

mercoledì 02 aprile 2008 - 13.56

program Profilo | Junior Member

Ciao,
sto realizzando un applicazione che utilizza diverse classi da me create ognuna scritta in un file diverso.
Volevo quindi creare una libreria di classi con questi file in modo da includerla poi nel progetto che andro' a realizzare.

Come devo fare?
Io per ora ho fatto Crea->Nuovo Progetto->Libreria di classi e ho aggiunto tutti i file delle classi.

Ora come dovrei fare?Devo compilarlo oppure aggiungo nel progetto del programma il progetto libreria di classi?

Scusate ma sono alle prime armi.

Grazie.

freeteo Profilo | Guru

ciao,
ti conviene fare un riferimento al progetto, e non al compilato, perche' cosi' hai sempre le ultime versioni correttamente agganciate.
Percio' sul nodo del progetto WIn32, fai "TastDX->Add Refernce->Projects->tuo progetto".

A questo punto hai tutto a posto, ti basta solo che lavori con il NameSpace corretto che hanno le classi. ("using ..." tipicamente)

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

program Profilo | Junior Member

Ok Grazie!

program Profilo | Junior Member

Non riesco a farlo...
Allora tasto destro sopra a progetto -> aggiungi riferimento ...-> progetti e pero mi esce un elenco vuoto se invece faccio sfoglia mi chiede il file dll.

Come mail?

Grazie.

TOPOAMORE Profilo | Expert

ciao
il file dll e la tua libreria compilata.
Crea il riferimento a quello

program Profilo | Junior Member

Un altro problema...Creando un nuovo progetto libreria di classi e includendo le librerie che usano:
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Windows.Forms;

Il compilatore mi da questo errore:
Errore 1 Il tipo o il nome dello spazio dei nomi 'Windows' non esiste nello spazio dei nomi 'System'; probabilmente manca un riferimento a un assembly

e si riferisce a using System.Windows.Forms;
Come mai? Non posso usarlo nelle librerie di classi?

Grazie.

aiedail92 Profilo | Expert

Ciao

l'errore deriva dal fatto che quando crei una libreria di classi non viene aggiunto automaticamente il riferimento a System.Windows.Forms. Per farlo clicca col destro sul progetto in Esplora soluzioni e poi seleziona Aggiungi Riferimento (oppure scegli Progetto -> Aggiungi riferimento); quindi dalla finestra che si apre, nella Tab ".NET" seleziona System.Windows.Forms e clicca su Ok. A questo punto l'errore dovrebbe scomparire.

Luca

program Profilo | Junior Member

Grazie.
Risolto.

Ora pero' ho un altro problema...............

Allora dal progetto principale ho incluso il file dll generato dalla libreria di classi.

Quando vado a far partire il progetto principale ho pero' errori che non avevo includendo tutte le classi nel progetto principale come era all'inizio.

Ecco alcuni errori:
Errore 3 'progetto.client' è inaccessibile a causa del livello di protezione
Errore 4 'progetto.client' è inaccessibile a causa del livello di protezione
Errore 5 Per il tipo 'progetto.client' non sono definiti costruttori
Errore 6 'progetto.client' non contiene una definizione per 'getData'

Se pero' includo le classi manualmente e levo il riferimento alla dll funziona tutto!

aiedail92 Profilo | Expert

Dunque, i primi due errori sono dovuti al fatto che quando cerchi di ottenere il campo progetto.client, questo non è accessibile, perchè dichiarato nella libreria con un livello di accessibilità troppo basso. Aggiungendo le classi al progetto l'errore non arriva perchè le classi appartengono allo stesso assembly, e quindi possono accedere una ai membri non privati dell'altra. Per ovviare all'errore dovresti dichiarare pubblico il membro o, se è un campo, fornire una proprietà di accesso ad esso per mantenere l'incapsulamento.

Il secondo errore deriva dal fatto che non hai fornito un costruttore pubblico per il tipo progetto.client, e quindi esso non è disponibile per creare un'istanza della classe. Probabilmente l'errore occorre quando cerchi di inizializzare una classe "progetto.client" con la parola chiave new; inizialmente l'errore non si presentava perchè potevi utilizzare il costruttore dallo stesso assembly, ma non avendolo dichiarato come pubblico, esso non è più visibile all'esterno dell'assembly che l'ha dichiarato. Stesso discorso per l'ultimo errore...

Luca

program Profilo | Junior Member

mmm sono confuso...allora vediamo ....

ora ho questi errori:

Errore 1 'progetto.subject' è inaccessibile a causa del livello di protezione
Errore 2 Accessibilità incoerente: la classe base 'progetto.subject' è meno accessibile della classe 'progetto.administrator'
Errore 3 'progetto.developer' è inaccessibile a causa del livello di protezione
Errore 4 Accessibilità incoerente: il tipo di campo 'progetto.developer' è meno accessibile del campo 'progetto.frmDevelopers.dev'

il primo e il secondo errore mi rimanda ad una definizione di una classe appartenente alla dll che ha questa intestazione:
class administrator:subject (che è la classe da cui deriva)
{
....
}

Il 3 e il 4 errore mi rimanda ad un campo di un form che è questo:
private developer dev;

developer sarebbe un tipo di una classe definita all'interno della dll.

Che devo fare?

Puo essere utile se vi posto il diagramma delle classi nella dll?
Grazie ancora.

aiedail92 Profilo | Expert

Giusto per farti capire: prova a cambiare "private developer dev" in "public developer dev", rendendolo pubblico: a questo punto gli errori 3 e 4 scompaiono perchè la classe ha l'accessibilità necessaria per essere "vista" all'esterno di essa.

Forse ti può essere utile questo schemino sui diversi livelli di accessibilità:

public -> Accessibile ovunque;
protected -> Accessibile alla classe di appartenenza o alle classi che derivano da essa;
internal -> Accessibile all'assembly di appartenenza;
protected internal -> accessibile all'assembly di appartenenza o ai tipi derivati dalla classe di appartenenza
private -> Accessibile solo all'interno della classe che lo dichiara;

Una delle restrizioni all'utilizzo dei livelli di accessibilità è che quando dichiari una classe questa non deve essere più accessibile di quella di base, e similmente quando dichiari un campo, questo deve essere accessibile al massimo quanto il suo tipo.

Per fare un esempio: se tu hai una classe privata chiamata BaseClass, non puoi dichiarare una classe pubblica DerivedClass che derivi da BaseClass, in quanto BaseClass ha un'accessibilità inferiore rispetto a DerivedClass. Questo viene fatto per non consentire l'accesso ad una classe ristretta mediante un'altra: se hai diachiarato una classe privata, quella deve rimanere privata, e non essere accessibile a nessun altro.

Stessa cosa avviene quando dichiari un campo: se hai una classe "MyClass" internal, quando dichiari un campo di tipo MyClass, esso deve avere come accessibilità al massimo internal, quindi può essere solo internal o private

Spero che tu abbia capito...

Luca

program Profilo | Junior Member

Ok piu o meno ho capito...non mi resta che continuare a provare!
l'unica cosa non ce modo di includere il progetto delle classi non compilato in modo da compilare tutto insieme ogni volta?

Grazie.

aiedail92 Profilo | Expert

Sì, potresti usare una singola soluzione contenente più progetti.

Dopo aver aperto il progetto della libreria delle classi, in esplora soluzioni clicca sul destro sulla soluzione (il primo nodo) e scegli Aggiungi -> Progetto esistente, quindi raggiungi la cartella dove hai salvato l'altro progetto, selezioni il file e clicca su apri. A questo punto la soluzione contiene i tuoi due progetti.

Luca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5