Learn & Get
Day #2: Sviluppo applicazioni
Tipi di applicazioni (Windows)
Windows Forms
...le conosciamo tutti...
.NET Class Library
Libreria di classi (business layer)
Console Application
Applicazioni console GUI DOS Like
Windows control library
Libreria di controlli windows
Window Service
Applicazione windows che girano al termine del boot di
Windows
Altri template
Estensioni di Visual Studio installate successivamente
Startup
FormX
Sub Main
Può stare in una classe
Application Framework
Si decide dalle proprietà del progetto (MyProject)
Impostazioni tipiche (Versione, Icona, Mode...)
Public Sub Main()
End Sub
Public Sub Main(args() as String)
End Sub
Environment.GetCommandLineArgs()
Environment.CommandLine()
Mostrare il form da Sub Main
Form è una classe in System.Windows.Form
Come tale va trattata
I forms sono classi che ereditano da Form
Sono realizzati come classi parziali (.designer.vb)
Non modificate il codice nel file .designer.vb
Il dilemma Form1.Show()
L’applicazione non parte...
Application.Run
L’applicazione ‘vive’ finchè ‘vive’ il form principale
Usate Application Framework
Analizzate la classe Application
Application.ThreadException
Application.Idle
Application.DoEvents
Application.Restart
Layout dei controlli
Controllo dell’allineamento
SnapLines
Margins (Bordo esterno)
Padding (Bordo interno)
Dock
Anchor
SplitPanel
LayoutControls
FlowLayout
TableLayout
Form Layout
MaximumSize
MinimumSize
StartPosition
FormBorderStyle
Form
AutoScroll
Opacity
I form possono essere trasparenti
Shaped
I forms possono avere forma irregolare
Styles
Application.EnableVisualStyles
TopMost
DialogResult
CenterToParent, CenterToScreen
Centrano il form rispetto al parent o allo schermo
AcceptButton e CancelButton
Interazione e aggiunta controlli
Supportano controlli COM (ocx)
Menu,ToolBars, StatusBars e ToolTips
Permettono di creare UI stile Office 2003
Il look è basato su una classe ToolStripRenderer
Draw
ToolStripItem
Professional
Custom
Renderer
ToolStripContainer
Permette di gestire il docking di items
Il renderer gestisce Load e Save dello stato degli items
ToolStripManager
Persiste/recupera il layout (Load/SaveSettings)
Stabilisce il renderer da usare
ContextMenuStrip
Permette di creare menu contestuali
Tooltip component
Help component
Applicazioni MDI
Form.IsMDIContainer=True
Form.MdiParent=Me
ToolStripMenu.MdiWindowListItem
Indica quale item gestirà le finestre visualizzate
Form.ActiveMDIChild
Indica il chil form attivo
Evento Form.MDIChildActivate
Generato quando il child form si attiva
LayoutMDI
Modifica il layout delle finestre child
Eredità Visuale
E’ possibile applicare l’ereditarietà anche ai Form
Creare form che ereditano UI e funzionalità da altri
Si può quindi evitare di rigenerare lo stesso form tutte le volte
Dialogs & Validation
Come in VB6
Controlli che facilitano l’uso delle dialogs
OpenFileDialog
SaveFileDialog
FontDialog
ColorDialog
...
Sono delle classi, quindi non è necessario usarli 
BrowseFolderDialog
Eventi Validating e Validated
Permettono di validare il contenuto di un controllo
Form.ValidateChildren
ErrorProvider
Fornisce indicazioni visive quando un controllo non è validato
Mouse & Keyboard
Non ci sono grandi differenze
Ogni controllo ha una serie di eventi
MouseEnter
MouseLeave
MouseHover
MouseWheel (non visibile nella Property window)
Control.SelectNextControl()
Control.GetNextControl()
KeyDown,KeyUp...
e.Handled=True indica che il tasto è stato gestito e non deve
essere propagato agli altri gestori evento
Control.ModifierKeys
Per conoscere lo stato dei tasti Ctrl,Shift e Alt
Drag & Drop
L’operazione è manuale e sincrona
E’ iniziata dal metodo DoDragDrop
Si applica ai controlli che hanno AllowDrop=True
Espongono una serie di eventi
DragEnter
DragLeave
DragOver
DragDrop
In DragEnter decidiamo quale operazione è applicabile
Copy,Move,None
In DragDrop
Recuperiamo il dato
GiveFeedback
Permette di usare dei cursori custom (source)
E’ possibile usare oggetti custom serializzabili
Printing
VB6: Printer agiva esclusivamente sulla stampante
VB2005: PrintDocument
System.Drawing.Printing
Descrive il documento da stampare (titolo...)
Fornisce una serie di eventi per il processo di stampa
Print() -> PrintPage
Non descrive il target della stampa
Il Target è l’oggetto astratto PrintController
StandardPrintController: Agisce sulla stampante (default)
PrintPreviewController: Fornisce un anteprima della stampa
Eventi
BeginPrint
PrintPage
EndPrint
QueryPageSettings
Permette di cambiare i dettagli della pagina (margini, colore...)
Printing
PageSetupDialog
Impostazioni della pagina di stampa
PrintDialog
Selezione della stampante di destinazione
E’ esposta dalla proprietà PrinterSettings di PrintDocument
PrinterSetting
Contiene tutte le info della stampante (IsDefault, Name...)
InstalledPrinters
Elenco delle stampanti installate
Tricks
PrintDoc.PrinterSettings.PrinterName=“...”
Creare un custom PrintController per pagine dinamiche
Controlli
Custom
Eredita da Control
La renderizzazione è a carico dello sviluppatore
Scrollabe
Eredita da ScrollableControl
Inherited
Eredita da un altro controllo
Permette di personalizzare un certo controllo
User Control
Eredita da UserControl
“MiniForm” con micro-funzionalità
Component
Eredita da Component
Non hanno interfaccia grafica, facilitano l’uso a design time
OwnerDraw
Controlli standard che delegano la gestione della UI al programmatore
Controlli -Ereditarietà
Object
Component
Control
ScrollableControl
UserControl
Controlli - Attributi
Permettono di personalizzare l’integrazione del
controllo nel designer.
Description(“Routa il testo di 180°”)
Category(“My Category”)
Browsable(true)
ReadOnly(true)
DisplayName
Indica il nome che apparirà nella Property Grid
Controlli - Attributi
DesignOnly
Determina se la proprietà è usata solo a design time
EditorBrowsable
Visibilità a livello intellisense
ToolboxBitmap
Icona associata al controllo
DefaultEvent
Evento di default
DefaultProperty
Proprietà di default
DefaultValue
Valore di default (usato per la serializzazione)
Localizable
Permette la localizzazione della proprietà
ParenthesizePropertyName
Visualizza la proprietà tra parentesi
SettingsBindable
Indica che la proprietà supporta binding
MergableProperty
Indica se la proprietà può essere “comunizzata” con altre
DesignerSerializationVisibility
Controlla la persistenza delle proprietà
Controlli - OwnerDraw
Listbox, ListView, ComboBox...
Proprietà DrawMode
Standard, OwnerDrawFixed,OwnerDrawVariable
Evento MeasureItem
Chiede quali sono le dimensioni dell’area da passare
all’evento DrawItem
Evento DrawItem
Viene passato un oggetto Graphics rappresentante
l’area su cui ‘agire’ e l’indice dell’item da disegnare
Risorse
Informazioni inserite nell’assembly a compile time che possono essere lette a
runtime
Vengono inserite nel manifest dell’assembly
Identificate con Namespace.Nome.Estensione
Assembly.GetManifestResourceNames
Assembly.GetManifestResourceStream
Le risorse non sono by default tipizzate
VS usa un file .resX il quale wrappa e tipizza le risorse
L’editing avviene attraverso l’editor di Visual Studio
Le risorse possono essere embedded o linkate
ResourceManager
Permette di leggere il contenuto dei files .resX
VS 2005 facilita l’utilizzo
I files .resX hanno un apposito editor
Genera una classe che espone le risorse in modo tipizzato
I files .resX sono gestiti dai vari controlli presenti in VS
Localizzazione
Globalizzazione
L’assicurare che un applicazione funzioni in qualsiasi parte del
mondo senza dovere ricompilare l’applicazione
Localizzazione
La capacità di un applicazione di gestire la ‘cultura’ locale
Localizzazione in VB6
VB6
Aggiunta di un file .res al progetto
Utilizzo del resource editor
Localizzare testo usando
LoadResString
LoadResPicture
LoadResData
No local/region aware
Difficile integrare culture
diverse
Difficile estendere la
localizzazione
No locale adaptive UI
No RTL support
Localizzazione in .NET
.NET
Si appoggia su files xml (.resx)
ResGen.exe .resx -> .resources
Le culture vengono gestite attraverso la classe CultureInfo
ResourceManager
Cerca le assembly satellite utilizzando la cultura della UI
Probing
<language-culture>
<language>
Neutral / Default culture
Tools
WinRes.exe
Lutz Roeder’s Resourcer (http://www.aisto.com/roeder/dotnet/)
Al.exe
SubClassing
Applicativo
S.O
Windows
Messaggi
Message pump
Messaggi
WndProc
WndProc
Windows
(Forms/controlli)
Windows
(Forms/controlli)
SubClassing in VB6
VB6:
SetWindowLong (GWL_WNDPROC )
Private Sub Form_Load()
_OldWindowProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, _
AddressOf NewWindowProc)
End Sub
Public Function NewWindowProc(ByVal hwnd As Long, ByVal
msg As Long, ByVal wParam As Long, lParam As Any) As
Long
...
NewWindowProc = CallWindowProc( _ OldWindowProc, hwnd,
msg, wParam, lParam)
End Function
Private Sub Form_Unload(Cancel As Integer)
SetWindowLong _ hwnd, GWL_WNDPROC, _ OldWindowProc
End Sub
SubClassing in VB6
Svantaggi
IDE Molto fragile
Debug difficile
Facile sbagliare
Alternative
MsgHook
MsgBlaster
SubClassing in .NET
La classe Control espone WndProc (protected)
Alla WndProc viene passata la struttura Message
E’ possibile intercettare i messaggi, modificarli e/o
passarli alla classe base
IMessageFilter
Permette di intercettare messaggi prima che
vengano inviati a Form/Controllo
Application.AddMessageFilter
Application.RemoveMessageFilter
Asyncronous Programming
Esistono 3 tipi di timer
System.Windows.Forms.Timer
Il “classico” timer basato su WM_TIMER
Tick ogni 55 ms
System.Timers.Timer
Basato su thread (evento)
Usa SyncronizyingObject per sincronizzare l’evento
Se il marshaling è occupato, accoda gli eventi
System.Threading.Timer
Basato su thread (callback)
Più preciso
BackgroundWorkerThread
Semplifica l’asyncronous programming
PInvoke
La porta ‘di servizio’ per accedere direttamente
a codice unmanaged
Win32 API
Dll statiche (non COM)
Codice .NET
C#,VB.NET...
.NET Framework
Win32 APIs
PInvoke – Attributo DllImport
[DllImport]
System.Runtime.InteropServices
.NET “way“
C# e VB.NET
www.pinvoke.net
Enunciato Declare
VB.NET Only
Può stare ovunque (form,classe...)
Qualche limitazione rispetto a <DllImport>
APIViewer 2003 utility
http://www.activevb.de/rubriken/apiviewer/index-apiviewereng.html
PInvoke – Attributo DllImport
<DllImport("user32.dll”)> _
Shared Function GetWindowText _
(ByVal hWnd as IntPtr, ByVal lpString As StringBuilder, ByVal
cch as Int32) as Int32
End Sub
Named arguments
Charset (Ansi,Auto e Unicode)
Declare [Auto,Ansi e Unicode] Sub...
ExactSpelling [true,false]
EntryPoint
Alias “...”
CallingConvention[WinApi,CDecl...]
PInvoke – Attributo DllImport
SetLastError[true,false]
True solo se usate Declare ...
Memorizza il codice di errore Win32 generato dalla funzione
GetLastError() e FormatMessage() APIs
Permette di ottenere ulteriori informazioni sulla causa di errore di
una chiamata ad una funzione Win32
Riduce le performaces
Int32 err=Marshal.GetLastWin32Error()
System.ComponentModel.Win32Exception()
PInvoke – Marshal di parametri numerici
BOOL Beep( DWORD dwFreq, DWORD dwDuration );
<DllImport("kernel32.dll")> _
Shared Function Beep(ByVal dwFreq As UInt32, _
ByVal dwDuration As UInt32) As Boolean
End Function
PInvoke – Direzione dei parametri
I parametri hanno una direzione
[in] ByVal (VB.NET)
[out] ByRef (VB.NET)
[in,out] ByRef (VB.NET)
BOOL WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD
nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED
lpOverlapped );
<DllImport("kernel32.dll", SetlastError:=True)> _
Private Shared Function WriteFile(ByVal hFile As IntPtr,_
ByVal Buffer As Byte(), ByVal nNumberOfBytesToWrite As Integer, _
ByRef lpNumberOfBytesWritten As Integer, _
ByRef lpOverlapped As OVERLAPPED) As Integer
End Function
PInvoke – Marshaling di stringhe
Direzione
[in] ByVal ... As String
[out] ByVal ... As System.Text.StringBuilder
Le Win32 API non ritornano mai stringhe
In .NET le stringhe sono immutabili
BOOL GetUserName( LPTSTR lpBuffer, LPDWORD nSize );
<DllImport("Advapi32.dll", CharSet:=CharSet.Auto,
SetLastError:=True)> _
Public Shared Function GetUserName(ByVal buffer As StringBuilder,
ByRef bufferLen As Integer) As Boolean
End Function
PInvoke – Marshaling di strutture
ByVal [in] o ByRef [in/out]
Il layout della struttura deve essere rispettato
Il compilatore può inserire dei byte di padding
Structure Test
Dim P1 as Byte
Dim P2 as Int32
Dim P3 as Int32
End Structure
// 1 byte
// 4 bytes
//4 bytes
Marshal.SizeOf( Test.GetType)
// ?
[StructLayout(LayoutKind.Sequential,Pack=1)]
Structure Test
Dim P1 as Byte
// 1 byte
Dim P2 as Int32
// 4 bytes
Dim P3 as Int32
//4 bytes
End Structure
Marshal.SizeOf( Test.GetType)
// 9
[MarshalAs(UnmanagedType.LPStr,SizeConst=128)] param As String
PInvoke - Callbacks
BOOL EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam );
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam );
Delegate Function EnumCallback _
(ByVal hWnd As IntPtr,ByVal param As Int32) As Boolean
#1
#2
<DllImport("user32.dll")>
Shared Function EnumWindows _
(ByVal callBack As EnumCallback,ByVal param As Int32) As Boolean
Private Function MyCallback
(ByVal hWnd As IntPtr, ByVal param As Int32) As Boolean
…
Return True
End Function
#3
EnumWindows(New EnumCallback(AddressOf MyCallback), 1234)
Uso!
Interoperabilità COM
.NET può usare oggetti COM
TlbImp (nell‘ SDK)
Strong named, modificare il namespace esportato
Impostando un reference ad un assembly COM
Marshal.ReleaseCOMObject
RegFreeCOM
Usare Assembly COM senza registrarle
IUnknown
Common Language
Runtime
ComServer
Object
IFoo
Runtime Callable
Wrapper
Reference
Counted
Client
Interoperabilità COM
.NET può creare oggetti COM
Il framework è sempre necessario
Add – New Item – COM Class
Usando <ComVisible> è possibile decidere cosa esporre al mondo COM
Register For COM Interop
RegAsm
RegSvr32 per assembly .NET
Creaun file .reg con le info di registrazion
TlbExp
Esporta la type library (early binding) da un assembly .NET Com enabled
IUnknown
COM Client
Common Language
Runtime
IDispatch
COM
Callable
Wrapper
Server
IFoo
Client
ADO.NET
Motore di accesso ai dati unificato per le applicazioni .NET
Windows, Web, Mobile apps
Nato per superare i limiti di ADO (COM,XML Support, Evolution approach)
Wrapper attorno al motore OLE DB
ADO.NET
No usa OleDB/COM ma providers nativi .NET
Non supporta cursori lato server
Consumano risorse lato server e non applicabili in alcuni tipi di
applicazioni
Supporta firehose cursors (read only, fwd only)
Supporta resultsets disconnessi
Ampio supporto all’ XML
Doppia modalità di funzionamento
Connesso
Connesso alla fonte usando firehose cursor
Disconnesso
Leggo i dati in un dataset e sconnetto (optimistic batch update mode)
ADO.NET – Oggetti principali
Connection
E’ l’oggetto che permette la connessione al DB
ConnectionString (compatibile con VB6)
Open/Close
Command
Indica il comando (Select,Update...) da inviare
DataReader
Permette la lettura dei dati eventualmente ritornati dal
comando
DataAdapter
Esegue il command e ritorna un DataSet / DataTable
Effettua la riconciliazione dei dati nel DB
ADO.NET – Oggetti principali
DataTable
Nuova versione del ResultSet
Disconnessa e Client Side
DataSet
Contiene più DataTable
Posso definire delle relazioni tra DataTable
Database, in memory e disconnesso
Totalmente indipendente dalla fonte dati
Text files, Xml files, DataBase...
ADO.NET – Providers
Blocchi di connessione all’ engine DB
OLEDb Provider
Permette di accedere a DB per i quali esiste un
provider OLE DB
MDac (ultima) + Jet Engine
SQLProvider
SQLServer 7.0 e superiore
No MDac
Provider nativo e ottimizzato per SQLServer
Offre funzionalità aggiuntive disponibili in SQLServer
ADO.NET – Namespaces
Tutte le classi sono in System.Data
System.Data.OleDB
Contiene tutte le classi per il provider OLEDB
System.Data.SQLClient
Contiene le classi native per SQLServer
System.Data.Common
Contiene le classi independenti dal provider (DataSet)
ProviderFactory
E’ il provider che si occupa di creare l’oggetto corretto
ADO.NET – Connection
E’ l’oggetto che effettua la connessione al DB
ConnectionString
www. Connectionstring.com
Provider=Microsoft.Jet.OLEDB4.0 (no per SQLConnection)
Initial Catalog / DataSource= /AttachDBFilename=
Open, Close, State
In caso di problemi viene generata una OLEDB/SQLException
Ha una collezione Errors che fornisce dettagli sul problema
Connection Pooling
Quando ci si connette ad un DB il provider crea un pool di connessioni
simili affichè ulteriori richieste di connessioni vengano gestite
velocemente
Basato sulla ConnectionString,può essere disabilitato,ConnectionTimeout
BeginTrans
OggettoTransaction su cui eseguire Commit o RollBack
IsolationLevel determina la modalità di lock durante la transazione
ADO.NET – Command
E’ l’oggetto che specifica quale azione compiere verso il DB
CommandText
La query SQL da eseguire
CommandType
Text, StoreProcedure
Connection
Connessione associata
Parameters
Collezione di parametri associati alla query (da preferire)
ExecuteReader
Ritorna un DataReader per l’accesso ai dati della query
ExecuteScalar
Esegue query e ritorna il valore della prima riga/colonna
Select Count(*) FROM ...
ExecuteNonQuery
Esegue la query e ritorna il numero di righe modificate
UPDATE SET...
ADO.NET – DataReader
Cursore ForwardOnly e ReadOnly
Permette di leggere i dati ritornati dalla query
Command
Comando associato
Connection
Connessione associata
HasRows
Indica la presenza di righe da leggere nel DataReader
Read
Legge il record successivo, ritorna false al termine
GetSchemaTable
Ritorna una DataTable con lo schema del DataReader
Close
Chiude il DataReader e rilascia le risorse associate
While reader.Read()
Data=Reader(columnIndex)
...
Data=reader(“FirstName”)
End While
ADO.NET – DataTable
Recordset statico disconnesso
In memory table
Formata da DataColumns e DataRows
Può contenere dati provenienti da più fonti (Query, file XML,
codice...)
Database independent
PrimaryKey (colonne che compongono la primarykey per quella
tabella)
DefaultView permette il filtering e sorting dei dati contenuti
Rows
Collezione delle “righe” contenute nella tabella
NewRow: Crea una nuova riga
Delete: Marca la riga come deleted
Ogni row mantiene il proprio stato e valore
E’ spesso contenuta in un DataSet
AcceptChanges / RejectChanges
Resetta lo stato delle righe nella DataTable
ADO.NET – DataSet
In memory disconnected database
Permette una visione gerarchica dei dati
Contiene 1 o più tabelle – Tables property
DataRelations
Descrive la relazione tra tabelle
Permettono di navigare tra le relazioni
ChildRelations
ParentRelations
Constraints
Regole di validazione dei dati presenti nel DataSet
Column Level: DataColumn (Unique, MaxLength...)
Table Level: ForeignKeyConstraint
Autogenerati in base alle relazioni tra tabelle
DeleteRule, UpdateRule
XML Support
Lo schema e i dati possono essere memorizzati in un file XML
ADO.NET – DataSet
Oggetto
DataSet
Tables
Relations
Table
Collezione
Columns
Column
Constraints
Constraint
Rows
Row
Relation
ADO.NET – DataView
E’ una “vista” dei dati contenuti in una tabella
Permette di avere delle viste ordinate e filtrate
Composta da insieme di DataRowView
Permette inserimenti/Eliminazioni
Agisce sulla Datatable associata
Usato nel DataBinding
Dim dv as New DataView(EmpTable)
dv.RowFilter=“FirstName LIKE A%”
dv.Sort=“FirstName,LastName”
dv.RowStateFilter=DataViewRowState.Unchanged
ADO.NET – DataAdapter
E’ l’anello di congiunzione tra DB e DataSet
E’ provider dependent
Commands
SelectCommand
InsertCommand
DeleteCommand
UpdateCommand
Fill
Riempe un DataSet con le info prese dal DB
FillSchema
Crea lo schema da un DB
Update
Allinea il DB con il contenuto del DataSet
ADO.NET – Update Model
Optimistic batch Update
Possono esserci conflitti
First / Last Win
Il comando Update scorre le righe e in base allo stato invoca il comando
SQL parametrico nei vari Cmds
I comandi possono essere autogenerati
CommandBuilder
Esegue una Select per recuperare le info
Single Table, Primary Key, PK nella query, No SP
Ogni DataTable ha un DataAdapter associato
HasChanges e GetChanges
Ritorna un DataSet con le sole modifiche
I parametri dei comandi indicano
Da quale colonna della DataRow recuperare il dato
Quale versione del dato usare (Current o Original)
Eventi DataAdapter.RowUpdating e RowUpdated
DataBinding
E’ “l’arte” di visualizzare dati ed aggiornarli
Classe Binding
Gestisce il legame tra dato e user interface
Espone eventi Format, Parse e BindingComplete
Gestione update e null values
Simple Binding
Un singolo oggetto è la fonte di Binding
Complex Binding
Un insieme di oggetti è la fonte di binding (IList)
Binding Manager
Viene creato per ogni Data Source esposta a binding
PropertyManager (fonte dati = single item)
CurrencyManager (fonte dati = list) permette la navigazione
Esposto da BindingContext (DataSource)
DataBinding
INotifyPropertyChanged
Informa il meccanismo di binding che una proprietà è cambiata
IBindingList
Gestisce i dettagli (AddNew,AllowNew...) per il complex binding
Complessa da implementare
BindingList (Of T)
E’ un implementazione generica di IBindingList
Fornisce il supporto al meccanismo di binding (Add,Update...)
Non funziona con insiemi già esistenti (es: DataRows)
BindingSource
Rappresenta un fonte di Binding
Si interpone tra la UI e la vera fonte dati
Espone qualsiasi tipo come IBindingList
Semplifica la gestione del Databinding
DataSource accetta un Type e supporta Design mode
DataBinding – UI support
Data Sources Window
Contiene le fonti di Binding
Posso trascinare in un form una data source (Details/View)
Lookup Data
Disponibile anche per la DataGridView
BindingSource support Sorting,Filtering e Searching
ClickOnce - Introduzione
Applicazioni
“Rich Client”
UI pratica e reattiva
Difficili da distribuire e aggiornare
Web
Server centrale, fix once.
Più difficile scrivere le applicazioni
DHTML, Javascript
No Offline mode
UI Experience limitata
Drag &Drop, Undo, Help...
ClickOnce - Introduzione
Oggi c’è sempre più richiesta di applicazioni con UI
“ricche”
Applicazioni Windows “Smart”
Offrono tutti i vantaggi di un applicazione Win32
Hanno la capacità di auto aggionarsi
Caratteristiche
Hanno la capacità di interagire con l’hardware e il
software installato
Funzionano sia Online che OffLine
Utilizzano una nuova modalità di
deployment/update
Possono funzionare su diverse piattaforme
ClickOnce - Caratteristiche
ClickOnce
Supporta il deploy e update di applicazioni .NET
CD-Rom
Percorso di rete
FTP
WEB
Integrata in Visual Studio 2005
Debug e Intellisense in Zone
Permission richieste
Permission calculator
Deploy Online e Offline
Update allo startup o programmatico
System.Deployment
RegFree COM
Slides?
http://download.manageddesigns.it/classes/VBLearnAndGet
Scarica

Learn & Get