60
Learn & Learn & Get Get Day #2: Sviluppo applicazioni Day #2: Sviluppo applicazioni

Learn & Get

Embed Size (px)

DESCRIPTION

Learn & Get. Day #2: Sviluppo applicazioni. 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 - PowerPoint PPT Presentation

Citation preview

Page 1: Learn & Get

Learn & Learn & GetGetDay #2: Sviluppo applicazioniDay #2: Sviluppo applicazioni

Page 2: Learn & Get

Tipi di applicazioni (Windows)Tipi di applicazioni (Windows)

Windows FormsWindows Forms...le conosciamo tutti......le conosciamo tutti...

.NET Class Library.NET Class LibraryLibreria di classi (business layer)Libreria di classi (business layer)

Console ApplicationConsole ApplicationApplicazioni console GUI DOS LikeApplicazioni console GUI DOS Like

Windows control libraryWindows control libraryLibreria di controlli windowsLibreria di controlli windows

Window ServiceWindow ServiceApplicazione windows che girano al termine del Applicazione windows che girano al termine del boot di Windowsboot di Windows

Altri templateAltri templateEstensioni di Visual Studio installate Estensioni di Visual Studio installate successivamentesuccessivamente

Page 3: Learn & Get

StartupStartupFormXFormXSub MainSub Main

Può stare in una classePuò stare in una classe

Application FrameworkApplication FrameworkSi decide dalle proprietà del progetto (MyProject)Si decide dalle proprietà del progetto (MyProject)

Impostazioni tipiche (Versione, Icona, Mode...)Impostazioni tipiche (Versione, Icona, Mode...)

Public Sub Main()Public Sub Main() End SubEnd Sub

Public Sub Main(args() as String)Public Sub Main(args() as String) End SubEnd Sub

Environment.GetCommandLineArgs()Environment.GetCommandLineArgs()Environment.CommandLine()Environment.CommandLine()

Page 4: Learn & Get

Mostrare il form da Sub MainMostrare il form da Sub MainForm è una classe in System.Windows.FormForm è una classe in System.Windows.Form

Come tale va trattataCome tale va trattata

I forms sono classi che ereditano da FormI forms sono classi che ereditano da FormSono realizzati come classi parziali (.designer.vb)Sono realizzati come classi parziali (.designer.vb)Non modificate il codice nel file .designer.vbNon modificate il codice nel file .designer.vb

Il dilemma Form1.Show()Il dilemma Form1.Show()L’applicazione non parte...L’applicazione non parte...Application.RunApplication.RunL’applicazione ‘vive’ finchè ‘vive’ il form principaleL’applicazione ‘vive’ finchè ‘vive’ il form principale

Usate Application FrameworkUsate Application Framework

Analizzate la classe ApplicationAnalizzate la classe ApplicationApplication.ThreadExceptionApplication.ThreadExceptionApplication.IdleApplication.IdleApplication.DoEventsApplication.DoEventsApplication.RestartApplication.Restart

Page 5: Learn & Get

Layout dei controlliLayout dei controlliControllo dell’allineamentoControllo dell’allineamento

SnapLinesSnapLinesMargins (Bordo esterno)Margins (Bordo esterno)Padding (Bordo interno)Padding (Bordo interno)DockDockAnchorAnchorSplitPanelSplitPanelLayoutControlsLayoutControls

FlowLayoutFlowLayoutTableLayoutTableLayout

Form LayoutForm LayoutMaximumSizeMaximumSizeMinimumSizeMinimumSizeStartPositionStartPositionFormBorderStyleFormBorderStyle

Page 6: Learn & Get

FormFormAutoScrollAutoScrollOpacityOpacity

I form possono essere trasparentiI form possono essere trasparenti

ShapedShapedI forms possono avere forma irregolareI forms possono avere forma irregolare

StylesStylesApplication.EnableVisualStylesApplication.EnableVisualStyles

TopMostTopMostDialogResultDialogResultCenterToParent, CenterToScreenCenterToParent, CenterToScreen

Centrano il form rispetto al parent o allo schermoCentrano il form rispetto al parent o allo schermo

AcceptButton e CancelButtonAcceptButton e CancelButtonInterazione e aggiunta controlliInterazione e aggiunta controlliSupportano controlli COM (ocx)Supportano controlli COM (ocx)

Page 7: Learn & Get

Menu,ToolBars, StatusBars e Menu,ToolBars, StatusBars e ToolTipsToolTipsPermettono di creare UI stile Office 2003Permettono di creare UI stile Office 2003

Il look è basato su una classe ToolStripRendererIl look è basato su una classe ToolStripRenderer

ToolStripItemToolStripItem

ProfessionalProfessionalRendererRenderer

DrawDraw CustomCustomRendererRenderer

ToolStripContainerToolStripContainer

Permette di gestire il docking di itemsPermette di gestire il docking di items

Il renderer gestisce Load e Save dello stato degli itemsIl renderer gestisce Load e Save dello stato degli items

ToolStripManagerToolStripManager

Persiste/recupera il layout (Load/SaveSettings)Persiste/recupera il layout (Load/SaveSettings)

Stabilisce il renderer da usareStabilisce il renderer da usare

ContextMenuStripContextMenuStrip

Permette di creare menu contestualiPermette di creare menu contestuali

Tooltip componentTooltip component

Help componentHelp component

Page 8: Learn & Get

Applicazioni MDIApplicazioni MDI

Form.IsMDIContainer=TrueForm.IsMDIContainer=True

Form.MdiParent=MeForm.MdiParent=Me

ToolStripMenu.MdiWindowListItemToolStripMenu.MdiWindowListItemIndica quale item gestirà le finestre visualizzateIndica quale item gestirà le finestre visualizzate

Form.ActiveMDIChildForm.ActiveMDIChildIndica il chil form attivoIndica il chil form attivo

Evento Form.MDIChildActivateEvento Form.MDIChildActivateGenerato quando il child form si attivaGenerato quando il child form si attiva

LayoutMDILayoutMDIModifica il layout delle finestre childModifica il layout delle finestre child

Page 9: Learn & Get

Eredità VisualeEredità Visuale

E’ possibile applicare l’ereditarietà anche ai FormE’ possibile applicare l’ereditarietà anche ai FormCreare form che ereditano UI e funzionalità da altriCreare form che ereditano UI e funzionalità da altri

Si può quindi evitare di rigenerare lo stesso form tutte le Si può quindi evitare di rigenerare lo stesso form tutte le voltevolte

Page 10: Learn & Get

Dialogs & ValidationDialogs & ValidationCome in VB6Come in VB6

Controlli che facilitano l’uso delle dialogsControlli che facilitano l’uso delle dialogsOpenFileDialogOpenFileDialogSaveFileDialogSaveFileDialogFontDialogFontDialogColorDialogColorDialog......

Sono delle classi, quindi non è necessario usarli Sono delle classi, quindi non è necessario usarli

BrowseFolderDialogBrowseFolderDialogEventi Validating e ValidatedEventi Validating e Validated

Permettono di validare il contenuto di un controlloPermettono di validare il contenuto di un controlloForm.ValidateChildrenForm.ValidateChildren

ErrorProviderErrorProviderFornisce indicazioni visive quando un controllo non è Fornisce indicazioni visive quando un controllo non è validatovalidato

Page 11: Learn & Get

Mouse & KeyboardMouse & KeyboardNon ci sono grandi differenzeNon ci sono grandi differenze

Ogni controllo ha una serie di eventiOgni controllo ha una serie di eventiMouseEnterMouseEnterMouseLeaveMouseLeaveMouseHoverMouseHoverMouseWheel (non visibile nella Property window)MouseWheel (non visibile nella Property window)

Control.SelectNextControl()Control.SelectNextControl()Control.GetNextControl()Control.GetNextControl()KeyDown,KeyUp...KeyDown,KeyUp...

e.Handled=True indica che il tasto è stato gestito e non e.Handled=True indica che il tasto è stato gestito e non deve essere propagato agli altri gestori eventodeve essere propagato agli altri gestori evento

Control.ModifierKeysControl.ModifierKeysPer conoscere lo stato dei tasti Ctrl,Shift e AltPer conoscere lo stato dei tasti Ctrl,Shift e Alt

Page 12: Learn & Get

Drag & DropDrag & DropL’operazione è manuale e sincronaL’operazione è manuale e sincronaE’ iniziata dal metodo DoDragDropE’ iniziata dal metodo DoDragDropSi applica ai controlli che hanno AllowDrop=TrueSi applica ai controlli che hanno AllowDrop=True

Espongono una serie di eventiEspongono una serie di eventiDragEnterDragEnterDragLeaveDragLeaveDragOverDragOverDragDropDragDrop

In DragEnter decidiamo quale operazione è applicabileIn DragEnter decidiamo quale operazione è applicabileCopy,Move,NoneCopy,Move,None

In DragDropIn DragDropRecuperiamo il datoRecuperiamo il dato

GiveFeedbackGiveFeedbackPermette di usare dei cursori custom (source)Permette di usare dei cursori custom (source)

E’ possibile usare oggetti custom serializzabiliE’ possibile usare oggetti custom serializzabili

Page 13: Learn & Get

PrintingPrintingVB6: Printer agiva esclusivamente sulla stampanteVB6: Printer agiva esclusivamente sulla stampanteVB2005: PrintDocumentVB2005: PrintDocument

System.Drawing.PrintingSystem.Drawing.PrintingDescrive il documento da stampare (titolo...)Descrive il documento da stampare (titolo...)Fornisce una serie di eventi per il processo di stampaFornisce una serie di eventi per il processo di stampa

Print() -> PrintPagePrint() -> PrintPage

Non descrive il target della stampaNon descrive il target della stampa

Il Target è l’oggetto astratto PrintController Il Target è l’oggetto astratto PrintController StandardPrintController: Agisce sulla stampante (default)StandardPrintController: Agisce sulla stampante (default)PrintPreviewController: Fornisce un anteprima della stampaPrintPreviewController: Fornisce un anteprima della stampa

EventiEventiBeginPrintBeginPrintPrintPagePrintPageEndPrintEndPrintQueryPageSettingsQueryPageSettings

Permette di cambiare i dettagli della pagina (margini, colore...)Permette di cambiare i dettagli della pagina (margini, colore...)

Page 14: Learn & Get

PrintingPrintingPageSetupDialogPageSetupDialog

Impostazioni della pagina di stampaImpostazioni della pagina di stampa

PrintDialogPrintDialogSelezione della stampante di destinazioneSelezione della stampante di destinazioneE’ esposta dalla proprietà PrinterSettings di PrintDocumentE’ esposta dalla proprietà PrinterSettings di PrintDocument

PrinterSettingPrinterSettingContiene tutte le info della stampante (IsDefault, Name...)Contiene tutte le info della stampante (IsDefault, Name...)InstalledPrintersInstalledPrinters

Elenco delle stampanti installateElenco delle stampanti installate

TricksTricksPrintDoc.PrinterSettings.PrinterName=“...”PrintDoc.PrinterSettings.PrinterName=“...”Creare un custom PrintController per pagine dinamicheCreare un custom PrintController per pagine dinamiche

Page 15: Learn & Get

ControlliControlli

CustomCustomEredita da ControlEredita da ControlLa renderizzazione è a carico dello sviluppatoreLa renderizzazione è a carico dello sviluppatore

ScrollabeScrollabeEredita da ScrollableControlEredita da ScrollableControl

InheritedInheritedEredita da un altro controlloEredita da un altro controlloPermette di personalizzare un certo controlloPermette di personalizzare un certo controllo

User ControlUser ControlEredita da UserControlEredita da UserControl““MiniForm” con micro-funzionalitàMiniForm” con micro-funzionalità

ComponentComponentEredita da ComponentEredita da ComponentNon hanno interfaccia grafica, facilitano l’uso a design timeNon hanno interfaccia grafica, facilitano l’uso a design time

OwnerDrawOwnerDrawControlli standard che delegano la gestione della UI al Controlli standard che delegano la gestione della UI al programmatoreprogrammatore

Page 16: Learn & Get

Controlli -EreditarietàControlli -Ereditarietà

ObjeObjectct

ComponenComponentt

ControControll

ScrollableContrScrollableControlol

UserControUserControll

Page 17: Learn & Get

Controlli - AttributiControlli - Attributi

Permettono di personalizzare l’integrazione Permettono di personalizzare l’integrazione del controllo nel designer.del controllo nel designer.

Description(“Routa il testo di 180°”)Description(“Routa il testo di 180°”)

Category(“My Category”)Category(“My Category”)

Browsable(true)Browsable(true)

ReadOnly(true)ReadOnly(true)

DisplayNameDisplayNameIndica il nome che apparirà nella Property GridIndica il nome che apparirà nella Property Grid

Page 18: Learn & Get

Controlli - AttributiControlli - AttributiDesignOnlyDesignOnly

Determina se la proprietà è usata solo a design timeDetermina se la proprietà è usata solo a design timeEditorBrowsableEditorBrowsable

Visibilità a livello intellisenseVisibilità a livello intellisenseToolboxBitmapToolboxBitmap

Icona associata al controlloIcona associata al controlloDefaultEventDefaultEvent

Evento di defaultEvento di defaultDefaultPropertyDefaultProperty

Proprietà di defaultProprietà di defaultDefaultValueDefaultValue

Valore di default (usato per la serializzazione)Valore di default (usato per la serializzazione)LocalizableLocalizable

Permette la localizzazione della proprietàPermette la localizzazione della proprietàParenthesizePropertyNameParenthesizePropertyName

Visualizza la proprietà tra parentesiVisualizza la proprietà tra parentesiSettingsBindableSettingsBindable

Indica che la proprietà supporta bindingIndica che la proprietà supporta bindingMergablePropertyMergableProperty

Indica se la proprietà può essere “comunizzata” con altreIndica se la proprietà può essere “comunizzata” con altreDesignerSerializationVisibilityDesignerSerializationVisibility

Controlla la persistenza delle proprietàControlla la persistenza delle proprietà

Page 19: Learn & Get

Controlli - OwnerDrawControlli - OwnerDraw

Listbox, ListView, ComboBox...Listbox, ListView, ComboBox...

Proprietà DrawModeProprietà DrawModeStandard, Standard, OwnerDrawFixed,OwnerDrawVariableOwnerDrawFixed,OwnerDrawVariable

Evento MeasureItemEvento MeasureItemChiede quali sono le dimensioni dell’area da Chiede quali sono le dimensioni dell’area da passare all’evento DrawItempassare all’evento DrawItem

Evento Evento DrawItemDrawItemViene passato un oggetto Graphics Viene passato un oggetto Graphics rappresentante l’area su cui ‘agire’ e l’indice rappresentante l’area su cui ‘agire’ e l’indice dell’item da disegnaredell’item da disegnare

Page 20: Learn & Get

RisorseRisorseInformazioni inserite nell’assembly a compile time che possono essere Informazioni inserite nell’assembly a compile time che possono essere lette a runtimelette a runtime

Vengono inserite nel manifest dell’assemblyVengono inserite nel manifest dell’assemblyIdentificate con Namespace.Nome.EstensioneIdentificate con Namespace.Nome.EstensioneAssembly.GetManifestResourceNamesAssembly.GetManifestResourceNamesAssembly.GetManifestResourceStreamAssembly.GetManifestResourceStream

Le risorse non sono by default tipizzateLe risorse non sono by default tipizzateVS usa un file .resX il quale wrappa e tipizza le risorseVS usa un file .resX il quale wrappa e tipizza le risorseL’editing avviene attraverso l’editor di Visual StudioL’editing avviene attraverso l’editor di Visual StudioLe risorse possono essere embedded o linkateLe risorse possono essere embedded o linkate

ResourceManagerResourceManagerPermette di leggere il contenuto dei files .resXPermette di leggere il contenuto dei files .resX

VS 2005 facilita l’utilizzoVS 2005 facilita l’utilizzoI files .resX hanno un apposito editorI files .resX hanno un apposito editorGenera una classe che espone le risorse in modo tipizzatoGenera una classe che espone le risorse in modo tipizzatoI files .resX sono gestiti dai vari controlli presenti in VSI files .resX sono gestiti dai vari controlli presenti in VS

Page 21: Learn & Get

GlobalizzazioneGlobalizzazioneL’assicurare che un applicazione funzioni in qualsiasi parte del mondo senza dovere L’assicurare che un applicazione funzioni in qualsiasi parte del mondo senza dovere ricompilare l’applicazionericompilare l’applicazione

LocalizzazioneLocalizzazioneLa capacità di un applicazione di gestire la ‘cultura’ localeLa capacità di un applicazione di gestire la ‘cultura’ locale

LocalizzazioneLocalizzazione

Page 22: Learn & Get

VB6VB6Aggiunta di un file .res al progettoAggiunta di un file .res al progetto

Utilizzo del resource editorUtilizzo del resource editor

Localizzare testo usandoLocalizzare testo usandoLoadResStringLoadResString

LoadResPictureLoadResPicture

LoadResDataLoadResData

No local/region awareNo local/region aware

Difficile integrare cultureDifficile integrare culturediversediverse

Difficile estendere laDifficile estendere lalocalizzazionelocalizzazione

No locale adaptive UINo locale adaptive UI

No RTL supportNo RTL support

Localizzazione in VB6Localizzazione in VB6

Page 23: Learn & Get

.NET.NETSi appoggia su files xml (.resx)Si appoggia su files xml (.resx)

ResGen.exe .resx -> .resources ResGen.exe .resx -> .resources

Le culture vengono gestite attraverso la classe Le culture vengono gestite attraverso la classe CultureInfoCultureInfo

ResourceManagerResourceManagerCerca le assembly satellite utilizzando la cultura della UICerca le assembly satellite utilizzando la cultura della UI

ProbingProbing<language-culture><language-culture>

<language><language>

Neutral / Default cultureNeutral / Default culture

ToolsToolsWinRes.exe WinRes.exe

Lutz Roeder’s Resourcer (http://www.aisto.com/roeder/dotnet/)Lutz Roeder’s Resourcer (http://www.aisto.com/roeder/dotnet/)

Al.exeAl.exe

Localizzazione in .NETLocalizzazione in .NET

Page 24: Learn & Get

SubClassingSubClassing

S.OWindows

MessaggiMessaggi

Applicativo

Windows(Forms/

controlli)

MessaggiMessaggi

WndProcWndProc

Windows(Forms/

controlli)

WndProcWndProc

Message Message pumppump

Page 25: Learn & Get

VB6: VB6: SetWindowLongSetWindowLong ( (GWL_WNDPROC )GWL_WNDPROC )

SubClassing in VB6SubClassing in VB6

Private Sub Form_Load()Private Sub Form_Load() _OldWindowProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, _ _OldWindowProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, _ AddressOf AddressOf NewWindowProcNewWindowProc))End SubEnd Sub

Public Function Public Function NewWindowProcNewWindowProc(ByVal hwnd As Long, ByVal (ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, lParam As Any) As Longmsg As Long, ByVal wParam As Long, lParam As Any) As Long......NewWindowProc = NewWindowProc = CallWindowProcCallWindowProc( _ OldWindowProc, hwnd, ( _ OldWindowProc, hwnd, msg, wParam, lParam)msg, wParam, lParam)End FunctionEnd Function

Private Sub Form_Unload(Cancel As Integer)Private Sub Form_Unload(Cancel As Integer) SetWindowLong _ hwnd, GWL_WNDPROC, _ OldWindowProcSetWindowLong _ hwnd, GWL_WNDPROC, _ OldWindowProcEnd SubEnd Sub

Page 26: Learn & Get

Svantaggi Svantaggi IDE Molto fragileIDE Molto fragile

Debug difficileDebug difficile

Facile sbagliareFacile sbagliare

AlternativeAlternativeMsgHookMsgHook

MsgBlasterMsgBlaster

SubClassing in VB6SubClassing in VB6

Page 27: Learn & Get

La classe Control espone La classe Control espone WndProcWndProc (protected) (protected)

Alla WndProc viene passata la struttura MessageAlla WndProc viene passata la struttura Message

E’ possibile intercettare i messaggi, modificarli E’ possibile intercettare i messaggi, modificarli e/o passarli alla classe basee/o passarli alla classe base

IMessageFilterIMessageFilter

Permette di intercettare messaggi prima che Permette di intercettare messaggi prima che vengano inviati a Form/Controllovengano inviati a Form/Controllo

Application.AddMessageFilterApplication.AddMessageFilter

Application.RemoveMessageFilterApplication.RemoveMessageFilter

SubClassing in .NETSubClassing in .NET

Page 28: Learn & Get

Asyncronous ProgrammingAsyncronous ProgrammingEsistono 3 tipi di timerEsistono 3 tipi di timer

System.Windows.Forms.TimerSystem.Windows.Forms.TimerIl “classico” timer basato su WM_TIMERIl “classico” timer basato su WM_TIMERTick ogni 55 msTick ogni 55 ms

System.Timers.TimerSystem.Timers.TimerBasato su thread (evento)Basato su thread (evento)Usa SyncronizyingObject per sincronizzare l’eventoUsa SyncronizyingObject per sincronizzare l’eventoSe il marshaling è occupato, accoda gli eventiSe il marshaling è occupato, accoda gli eventi

System.Threading.TimerSystem.Threading.TimerBasato su thread (callback)Basato su thread (callback)Più precisoPiù preciso

BackgroundWorkerThreadBackgroundWorkerThreadSemplifica l’asyncronous programmingSemplifica l’asyncronous programming

Page 29: Learn & Get

La porta ‘di servizio’ per accedere La porta ‘di servizio’ per accedere direttamente a codice unmanageddirettamente a codice unmanaged

Win32 APIWin32 API

Dll statiche (non COM)Dll statiche (non COM)

Codice .NETCodice .NETC#,VB.NET...C#,VB.NET...

.NET Framework.NET Framework

Win32 APIsWin32 APIs

PInvoke

PInvokePInvoke

Page 30: Learn & Get

PInvoke – Attributo DllImportPInvoke – Attributo DllImport

[[DllImportDllImport]]System.Runtime.InteropServicesSystem.Runtime.InteropServices.NET “way“.NET “way“C# e VB.NETC# e VB.NETwww.pinvoke.netwww.pinvoke.net

Enunciato Enunciato DeclareDeclareVB.NET OnlyVB.NET OnlyPuò stare ovunque (form,classe...)Può stare ovunque (form,classe...)Qualche limitazione rispetto a <DllImport>Qualche limitazione rispetto a <DllImport>APIViewer 2003 utilityAPIViewer 2003 utility

http://www.activevb.de/rubriken/apiviewer/index-apiviewereng.html

Page 31: Learn & Get

PInvoke – Attributo DllImportPInvoke – Attributo DllImport

<DllImport("user32.dll”)> _<DllImport("user32.dll”)> _SharedShared Function Function GetWindowTextGetWindowText _ _(ByVal hWnd as IntPtr, ByVal lpString As StringBuilder, ByVal (ByVal hWnd as IntPtr, ByVal lpString As StringBuilder, ByVal cch as Int32) as Int32cch as Int32) as Int32End SubEnd Sub

Named argumentsNamed argumentsCharset (Ansi,Auto e Unicode)Charset (Ansi,Auto e Unicode)

Declare [Auto,Ansi e Unicode] Sub...Declare [Auto,Ansi e Unicode] Sub...ExactSpelling [true,false]ExactSpelling [true,false]

EntryPointEntryPointAlias “...”Alias “...”

CallingConvention[WinApi,CDecl...]CallingConvention[WinApi,CDecl...]

Page 32: Learn & Get

SetLastErrorSetLastError[true,false][true,false]True True solosolo se usate Declare ... se usate Declare ...

Memorizza il codice di errore Win32 generato dalla funzioneMemorizza il codice di errore Win32 generato dalla funzione

GetLastError() e FormatMessage() APIsGetLastError() e FormatMessage() APIs

Permette di ottenere ulteriori informazioni sulla causa di Permette di ottenere ulteriori informazioni sulla causa di errore di una chiamata ad una funzione Win32errore di una chiamata ad una funzione Win32

Riduce le performacesRiduce le performaces

Int32 err=Int32 err=Marshal.GetLastWin32Error()Marshal.GetLastWin32Error()

System.ComponentModel.System.ComponentModel.Win32Exception()Win32Exception()

PInvoke – Attributo DllImportPInvoke – Attributo DllImport

Page 33: Learn & Get

BOOL Beep( DWORD dwFreq, DWORD dwDuration );

PInvoke – Marshal di parametri numericiPInvoke – Marshal di parametri numerici

<DllImport("kernel32.dll")> _Shared Function Beep(ByVal dwFreq As UInt32, _ByVal dwDuration As UInt32) As BooleanEnd Function

Page 34: Learn & Get

I parametri hanno una direzioneI parametri hanno una direzione

[in] ByVal (VB.NET)[in] ByVal (VB.NET)

[out] ByRef (VB.NET) [out] ByRef (VB.NET)

[in,out] ByRef (VB.NET)[in,out] ByRef (VB.NET)

PInvoke – Direzione dei parametriPInvoke – Direzione dei parametri

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 IntegerEnd Function

Page 35: Learn & Get

DirezioneDirezione[in][in] ByVal ... As String ByVal ... As String

[out][out] ByVal ... As ByVal ... As System.Text.StringBuilderSystem.Text.StringBuilder

Le Win32 API non ritornano mai stringheLe Win32 API non ritornano mai stringhe

In .NET le stringhe sono immutabiliIn .NET le stringhe sono immutabili

PInvoke – Marshaling di stringhePInvoke – Marshaling di stringhe

BOOL BOOL GetUserNameGetUserName( LPTSTR ( LPTSTR lpBufferlpBuffer, LPDWORD , LPDWORD nSizenSize ); );

<DllImport("Advapi32.dll", CharSet:=CharSet.Auto, <DllImport("Advapi32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _SetLastError:=True)> _Public Shared Function GetUserName(ByVal buffer As StringBuilder, Public Shared Function GetUserName(ByVal buffer As StringBuilder, ByRef bufferLen As Integer) As BooleanByRef bufferLen As Integer) As BooleanEnd FunctionEnd Function

Page 36: Learn & Get

ByVal [in] o ByRef [in/out]ByVal [in] o ByRef [in/out]

Il layout della struttura deve essere rispettatoIl layout della struttura deve essere rispettato

Il compilatore può inserire dei byte di paddingIl compilatore può inserire dei byte di padding

PInvoke – Marshaling di strutturePInvoke – Marshaling di strutture

Structure TestStructure Test Dim P1 as ByteDim P1 as Byte // 1 byte // 1 byte Dim P2 as Int32Dim P2 as Int32 // 4 bytes // 4 bytes Dim P3 as Int32Dim P3 as Int32 //4 bytes //4 bytesEnd StructureEnd StructureMarshal.SizeOf( Test.GetType)Marshal.SizeOf( Test.GetType) // ?// ?

[MarshalAs(UnmanagedType.LPStr,SizeConst=128)] param As String[MarshalAs(UnmanagedType.LPStr,SizeConst=128)] param As String

[[StructLayoutStructLayout((LayoutKind.SequentialLayoutKind.Sequential,Pack=1)],Pack=1)]Structure TestStructure Test Dim P1 as ByteDim P1 as Byte // 1 byte // 1 byte Dim P2 as Int32Dim P2 as Int32 // 4 bytes // 4 bytes Dim P3 as Int32Dim P3 as Int32 //4 bytes //4 bytesEnd StructureEnd StructureMarshal.SizeOf( Test.GetType)Marshal.SizeOf( Test.GetType) // 9// 9

Page 37: Learn & Get

Delegate Function Delegate Function EnumCallbackEnumCallback _ _(ByVal hWnd As IntPtr,ByVal param As Int32) As Boolean(ByVal hWnd As IntPtr,ByVal param As Int32) As Boolean

PInvoke - CallbacksPInvoke - Callbacks

BOOL EnumWindows(BOOL EnumWindows(WNDENUMPROCWNDENUMPROC lpEnumFunc,LPARAM lParam ); lpEnumFunc,LPARAM lParam );

BOOL CALLBACK EnumWindowsProc(HWND BOOL CALLBACK EnumWindowsProc(HWND hwndhwnd,LPARAM ,LPARAM lParamlParam ); );

#1#1

<DllImport("user32.dll")><DllImport("user32.dll")>Shared Function EnumWindows _Shared Function EnumWindows _(ByVal callBack As (ByVal callBack As EnumCallbackEnumCallback,ByVal param As Int32) As Boolean,ByVal param As Int32) As Boolean

#2#2

Private Function MyCallbackPrivate Function MyCallback(ByVal hWnd As IntPtr, ByVal param As Int32) As Boolean(ByVal hWnd As IntPtr, ByVal param As Int32) As Boolean … … Return TrueReturn TrueEnd FunctionEnd Function

#3#3

EnumWindows(New EnumCallback(AddressOf MyCallback), 1234)EnumWindows(New EnumCallback(AddressOf MyCallback), 1234)Uso!Uso!

Page 38: Learn & Get

Interoperabilità COMInteroperabilità COM..NET può usare oggetti COMNET può usare oggetti COM

TlbImp (nell‘ SDK)TlbImp (nell‘ SDK)Strong named, modificare il namespace esportatoStrong named, modificare il namespace esportato

Impostando un reference ad un assembly COMImpostando un reference ad un assembly COMMarshal.ReleaseCOMObjectMarshal.ReleaseCOMObjectRegFreeCOMRegFreeCOM

Usare Assembly COM senza registrarleUsare Assembly COM senza registrarle

Runtime CallableRuntime CallableWrapperWrapper

Common Language Common Language RuntimeRuntime

IFooIFoo

IUnknownIUnknown

ComServerComServer

ClientClient

ReferenceCounted

ObjectObject

Page 39: Learn & Get

Interoperabilità COMInteroperabilità COM..NET può creare oggetti COMNET può creare oggetti COM

Il framework è sempre necessarioIl framework è sempre necessarioAdd – New Item – COM ClassAdd – New Item – COM ClassUsando <ComVisible> è possibile decidere cosa esporre al mondo COMUsando <ComVisible> è possibile decidere cosa esporre al mondo COMRegister For COM InteropRegister For COM Interop

RegAsmRegAsmRegSvr32 per assembly .NETRegSvr32 per assembly .NETCreaun file .reg con le info di registrazionCreaun file .reg con le info di registrazion

TlbExpTlbExpEsporta la type library (early binding) da un assembly .NET Com enabledEsporta la type library (early binding) da un assembly .NET Com enabled

IFooIFoo

IDispatchIDispatch

IUnknownIUnknown

COM COM CallableCallableWrapperWrapper

Common Language Common Language RuntimeRuntime

ClientClient

COM ClientCOM Client

ServerServer

Page 40: Learn & Get

ADO.NETADO.NETMotore di accesso ai dati unificato per le Motore di accesso ai dati unificato per le applicazioni .NETapplicazioni .NET

Windows, Web, Mobile appsWindows, Web, Mobile apps

Nato per superare i limiti di ADO (COM,XML Support, Evolution Nato per superare i limiti di ADO (COM,XML Support, Evolution approach)approach)

Wrapper attorno al motore OLE DBWrapper attorno al motore OLE DB

ADO.NETADO.NETNo usa OleDB/COM ma providers nativi .NETNo usa OleDB/COM ma providers nativi .NET

Non supporta cursori lato serverNon supporta cursori lato server

Consumano risorse lato server e non applicabili in alcuni tipi Consumano risorse lato server e non applicabili in alcuni tipi di applicazionidi applicazioni

Supporta firehose cursors (read only, fwd only)Supporta firehose cursors (read only, fwd only)

Supporta resultsets disconnessiSupporta resultsets disconnessi

Ampio supporto all’ XMLAmpio supporto all’ XML

Doppia modalità di funzionamentoDoppia modalità di funzionamentoConnessoConnesso

Connesso alla fonte usando firehose cursorConnesso alla fonte usando firehose cursor

DisconnessoDisconnessoLeggo i dati in un dataset e sconnetto (optimistic batch Leggo i dati in un dataset e sconnetto (optimistic batch update mode)update mode)

Page 41: Learn & Get

ADO.NET – Oggetti principaliADO.NET – Oggetti principaliConnectionConnection

E’ l’oggetto che permette la connessione al DBE’ l’oggetto che permette la connessione al DB

ConnectionString (compatibile con VB6)ConnectionString (compatibile con VB6)

Open/CloseOpen/Close

CommandCommandIndica il comando (Select,Update...) da inviareIndica il comando (Select,Update...) da inviare

DataReaderDataReaderPermette la lettura dei dati eventualmente Permette la lettura dei dati eventualmente ritornati dal comandoritornati dal comando

DataAdapterDataAdapterEsegue il command e ritorna un DataSet / Esegue il command e ritorna un DataSet / DataTableDataTable

Effettua la riconciliazione dei dati nel DBEffettua la riconciliazione dei dati nel DB

Page 42: Learn & Get

ADO.NET – Oggetti principaliADO.NET – Oggetti principali

DataTableDataTableNuova versione del ResultSetNuova versione del ResultSet

Disconnessa e Client SideDisconnessa e Client Side

DataSetDataSetContiene più DataTableContiene più DataTable

Posso definire delle relazioni tra DataTablePosso definire delle relazioni tra DataTable

Database, in memory e disconnessoDatabase, in memory e disconnesso

Totalmente indipendente dalla fonte datiTotalmente indipendente dalla fonte datiText files, Xml files, DataBase...Text files, Xml files, DataBase...

Page 43: Learn & Get

ADO.NET – ProvidersADO.NET – Providers

Blocchi di connessione all’ engine DBBlocchi di connessione all’ engine DB

OLEDb ProviderOLEDb ProviderPermette di accedere a DB per i quali esiste un Permette di accedere a DB per i quali esiste un provider OLE DBprovider OLE DB

MDac (ultima) + Jet EngineMDac (ultima) + Jet Engine

SQLProviderSQLProviderSQLServer 7.0 e superioreSQLServer 7.0 e superiore

No MDacNo MDac

Provider nativo e ottimizzato per SQLServerProvider nativo e ottimizzato per SQLServer

Offre funzionalità aggiuntive disponibili in Offre funzionalità aggiuntive disponibili in SQLServerSQLServer

Page 44: Learn & Get

ADO.NET – NamespacesADO.NET – Namespaces

Tutte le classi sono in System.DataTutte le classi sono in System.Data

System.Data.OleDBSystem.Data.OleDB

Contiene tutte le classi per il provider OLEDBContiene tutte le classi per il provider OLEDB

System.Data.SQLClientSystem.Data.SQLClient

Contiene le classi native per SQLServerContiene le classi native per SQLServer

System.Data.CommonSystem.Data.CommonContiene le classi independenti dal provider (DataSet)Contiene le classi independenti dal provider (DataSet)

ProviderFactoryProviderFactoryE’ il provider che si occupa di creare l’oggetto correttoE’ il provider che si occupa di creare l’oggetto corretto

Page 45: Learn & Get

ADO.NET – ConnectionADO.NET – ConnectionE’ l’oggetto che effettua la connessione al DBE’ l’oggetto che effettua la connessione al DB

ConnectionStringConnectionStringwww. Connectionstring.comwww. Connectionstring.com

Provider=Microsoft.Jet.OLEDB4.0 (no per SQLConnection)Provider=Microsoft.Jet.OLEDB4.0 (no per SQLConnection)

Initial Catalog / DataSource= /AttachDBFilename=Initial Catalog / DataSource= /AttachDBFilename=

Open, Close, StateOpen, Close, StateIn caso di problemi viene generata una OLEDB/SQLExceptionIn caso di problemi viene generata una OLEDB/SQLException

Ha una collezione Errors che fornisce dettagli sul problemaHa una collezione Errors che fornisce dettagli sul problema

Connection PoolingConnection PoolingQuando ci si connette ad un DB il provider crea un pool di Quando ci si connette ad un DB il provider crea un pool di connessioni simili affichè ulteriori richieste di connessioni connessioni simili affichè ulteriori richieste di connessioni vengano gestite velocementevengano gestite velocemente

Basato sulla ConnectionString,può essere Basato sulla ConnectionString,può essere disabilitato,ConnectionTimeout disabilitato,ConnectionTimeout

BeginTransBeginTransOggettoTransaction su cui eseguire Commit o RollBackOggettoTransaction su cui eseguire Commit o RollBack

IsolationLevel determina la modalità di lock durante la IsolationLevel determina la modalità di lock durante la transazionetransazione

Page 46: Learn & Get

ADO.NET – CommandADO.NET – CommandE’ l’oggetto che specifica quale azione compiere verso il DBE’ l’oggetto che specifica quale azione compiere verso il DB

CommandTextCommandTextLa query SQL da eseguireLa query SQL da eseguire

CommandTypeCommandTypeText, StoreProcedureText, StoreProcedure

ConnectionConnectionConnessione associataConnessione associata

ParametersParametersCollezione di parametri associati alla query (da preferire)Collezione di parametri associati alla query (da preferire)

ExecuteReaderExecuteReaderRitorna un DataReader per l’accesso ai dati della queryRitorna un DataReader per l’accesso ai dati della query

ExecuteScalarExecuteScalarEsegue query e ritorna il valore della prima riga/colonnaEsegue query e ritorna il valore della prima riga/colonna

Select Count(*) FROM ...Select Count(*) FROM ...

ExecuteNonQueryExecuteNonQueryEsegue la query e ritorna il numero di righe modificateEsegue la query e ritorna il numero di righe modificate

UPDATE SET...UPDATE SET...

Page 47: Learn & Get

ADO.NET – DataReaderADO.NET – DataReaderCursore ForwardOnly e ReadOnlyCursore ForwardOnly e ReadOnly

Permette di leggere i dati ritornati dalla queryPermette di leggere i dati ritornati dalla query

CommandCommandComando associatoComando associato

Connection Connection Connessione associataConnessione associata

HasRowsHasRowsIndica la presenza di righe da leggere nel DataReaderIndica la presenza di righe da leggere nel DataReader

ReadReadLegge il record successivo, ritorna false al termineLegge il record successivo, ritorna false al termine

GetSchemaTableGetSchemaTableRitorna una DataTable con lo schema del DataReaderRitorna una DataTable con lo schema del DataReader

CloseCloseChiude il DataReader e rilascia le risorse associateChiude il DataReader e rilascia le risorse associate

While reader.Read()While reader.Read() Data=Reader(columnIndex)Data=Reader(columnIndex) ...... Data=reader(“FirstName”)Data=reader(“FirstName”)End WhileEnd While

Page 48: Learn & Get

ADO.NET – DataTableADO.NET – DataTableRecordset statico disconnessoRecordset statico disconnesso

In memory tableIn memory table

Formata da DataColumns e DataRowsFormata da DataColumns e DataRows

Può contenere dati provenienti da più fonti (Query, file Può contenere dati provenienti da più fonti (Query, file XML, codice...)XML, codice...)

Database independentDatabase independent

PrimaryKeyPrimaryKey (colonne che compongono la primarykey (colonne che compongono la primarykey per quella tabella)per quella tabella)

DefaultViewDefaultView permette il filtering e sorting dei dati permette il filtering e sorting dei dati contenuti contenuti

RowsRows

Collezione delle “righe” contenute nella tabellaCollezione delle “righe” contenute nella tabella

NewRow: Crea una nuova riga NewRow: Crea una nuova riga

Delete: Marca la riga come deletedDelete: Marca la riga come deleted

Ogni row mantiene il proprio stato e valoreOgni row mantiene il proprio stato e valore

E’ spesso contenuta in un E’ spesso contenuta in un DataSetDataSet

AcceptChanges / RejectChangesAcceptChanges / RejectChangesResetta lo stato delle righe nella DataTableResetta lo stato delle righe nella DataTable

Page 49: Learn & Get

ADO.NET – DataSetADO.NET – DataSetIn memory disconnected databaseIn memory disconnected database

Permette una visione gerarchica dei datiPermette una visione gerarchica dei dati

Contiene 1 o più tabelle – Tables propertyContiene 1 o più tabelle – Tables property

DataRelationsDataRelationsDescrive la relazione tra tabelleDescrive la relazione tra tabelle

Permettono di navigare tra le relazioni Permettono di navigare tra le relazioni

ChildRelationsChildRelations

ParentRelationsParentRelations

ConstraintsConstraintsRegole di validazione dei dati presenti nel DataSetRegole di validazione dei dati presenti nel DataSet

Column Level: DataColumn (Unique, MaxLength...)Column Level: DataColumn (Unique, MaxLength...)

Table Level: ForeignKeyConstraintTable Level: ForeignKeyConstraint

Autogenerati in base alle relazioni tra tabelleAutogenerati in base alle relazioni tra tabelle

DeleteRule, UpdateRuleDeleteRule, UpdateRule

XML SupportXML SupportLo schema e i dati possono essere memorizzati in un file Lo schema e i dati possono essere memorizzati in un file XMLXML

Page 50: Learn & Get

ADO.NET – DataSetADO.NET – DataSet

ConstraintConstraintss

ConstrainConstraintt

ColumnsColumns ColumnColumn

DataSetDataSet

TablesTables TableTable

OggettoOggetto

CollezioneCollezione

RelationsRelations RelationRelation

RowsRows RowRow

Page 51: Learn & Get

ADO.NET – DataViewADO.NET – DataView

E’ una “vista” dei dati contenuti in una tabellaE’ una “vista” dei dati contenuti in una tabella

Permette di avere delle viste ordinate e filtratePermette di avere delle viste ordinate e filtrate

Composta da insieme di DataRowViewComposta da insieme di DataRowView

Permette inserimenti/EliminazioniPermette inserimenti/Eliminazioni

Agisce sulla Datatable associataAgisce sulla Datatable associata

Usato nel DataBindingUsato nel DataBinding

Dim dv as New DataView(EmpTable)Dim dv as New DataView(EmpTable)dv.RowFilter=“FirstName LIKE A%”dv.RowFilter=“FirstName LIKE A%”dv.Sort=“FirstName,LastName”dv.Sort=“FirstName,LastName”dv.RowStateFilter=DataViewRowState.Unchangeddv.RowStateFilter=DataViewRowState.Unchanged

Page 52: Learn & Get

ADO.NET – DataAdapterADO.NET – DataAdapter

E’ l’anello di congiunzione tra DB e DataSetE’ l’anello di congiunzione tra DB e DataSet

E’ provider dependentE’ provider dependent

CommandsCommandsSelectCommandSelectCommand

InsertCommandInsertCommand

DeleteCommandDeleteCommand

UpdateCommandUpdateCommand

FillFillRiempe un DataSet con le info prese dal DBRiempe un DataSet con le info prese dal DB

FillSchemaFillSchemaCrea lo schema da un DBCrea lo schema da un DB

UpdateUpdateAllinea il DB con il contenuto del DataSetAllinea il DB con il contenuto del DataSet

Page 53: Learn & Get

ADO.NET – Update ModelADO.NET – Update Model

Optimistic batch UpdateOptimistic batch UpdatePossono esserci conflittiPossono esserci conflitti

First / Last WinFirst / Last Win

Il comando Update scorre le righe e in base allo stato invoca il Il comando Update scorre le righe e in base allo stato invoca il comando SQL parametrico nei vari Cmdscomando SQL parametrico nei vari Cmds

I comandi possono essere autogeneratiI comandi possono essere autogenerati

CommandBuilderCommandBuilder

Esegue una Select per recuperare le infoEsegue una Select per recuperare le info

Single Table, Primary Key, PK nella query, No SP Single Table, Primary Key, PK nella query, No SP

Ogni DataTable ha un DataAdapter associatoOgni DataTable ha un DataAdapter associato

HasChangesHasChanges e e GetChangesGetChanges

Ritorna un DataSet con le sole modificheRitorna un DataSet con le sole modifiche

I parametri dei comandi indicanoI parametri dei comandi indicano

Da quale colonna della DataRow recuperare il datoDa quale colonna della DataRow recuperare il dato

Quale versione del dato usare (Current o Original)Quale versione del dato usare (Current o Original)

Eventi DataAdapter.RowUpdating e RowUpdatedEventi DataAdapter.RowUpdating e RowUpdated

Page 54: Learn & Get

DataBindingDataBindingE’ “l’arte” di visualizzare dati ed aggiornarliE’ “l’arte” di visualizzare dati ed aggiornarli

Classe Classe BindingBindingGestisce il legame tra dato e user interfaceGestisce il legame tra dato e user interface

Espone eventi Format, Parse e BindingCompleteEspone eventi Format, Parse e BindingComplete

Gestione update e null valuesGestione update e null values

Simple BindingSimple BindingUn singolo oggetto è la fonte di BindingUn singolo oggetto è la fonte di Binding

Complex BindingComplex BindingUn insieme di oggetti è la fonte di binding (IList)Un insieme di oggetti è la fonte di binding (IList)

Binding ManagerBinding ManagerViene creato per ogni Data Source esposta a bindingViene creato per ogni Data Source esposta a binding

PropertyManager (fonte dati = single item)PropertyManager (fonte dati = single item)

CurrencyManager (fonte dati = list) permette la CurrencyManager (fonte dati = list) permette la navigazionenavigazione

Esposto da BindingContext (DataSource)Esposto da BindingContext (DataSource)

Page 55: Learn & Get

DataBindingDataBindingINotifyPropertyChangedINotifyPropertyChanged

Informa il meccanismo di binding che una proprietà è Informa il meccanismo di binding che una proprietà è cambiatacambiata

IBindingListIBindingListGestisce i dettagli (AddNew,AllowNew...) per il complex Gestisce i dettagli (AddNew,AllowNew...) per il complex bindingbinding

Complessa da implementareComplessa da implementare

BindingList (Of T)BindingList (Of T)E’ un implementazione generica di IBindingListE’ un implementazione generica di IBindingList

Fornisce il supporto al meccanismo di binding Fornisce il supporto al meccanismo di binding (Add,Update...)(Add,Update...)

Non funziona con insiemi già esistenti (es: DataRows)Non funziona con insiemi già esistenti (es: DataRows)

BindingSourceBindingSourceRappresenta un fonte di BindingRappresenta un fonte di Binding

Si interpone tra la UI e la vera fonte datiSi interpone tra la UI e la vera fonte dati

Espone qualsiasi tipo come IBindingListEspone qualsiasi tipo come IBindingList

Semplifica la gestione del DatabindingSemplifica la gestione del Databinding

DataSource accetta un Type e supporta Design modeDataSource accetta un Type e supporta Design mode

Page 56: Learn & Get

DataBinding – UI supportDataBinding – UI supportData Sources WindowData Sources Window

Contiene le fonti di BindingContiene le fonti di Binding

Posso trascinare in un form una data source Posso trascinare in un form una data source (Details/View)(Details/View)

Lookup DataLookup DataDisponibile anche per la DataGridViewDisponibile anche per la DataGridView

BindingSource support Sorting,Filtering e BindingSource support Sorting,Filtering e SearchingSearching

Page 57: Learn & Get

ClickOnce - IntroduzioneClickOnce - Introduzione

ApplicazioniApplicazioni

““Rich Client”Rich Client”

UI pratica e reattivaUI pratica e reattiva

Difficili da distribuire e aggiornareDifficili da distribuire e aggiornare

WebWeb

Server centrale, fix once.Server centrale, fix once.

Più difficile scrivere le applicazioniPiù difficile scrivere le applicazioni

DHTML, JavascriptDHTML, Javascript

No Offline modeNo Offline mode

UI Experience limitataUI Experience limitata

Drag &Drop, Undo, Help...Drag &Drop, Undo, Help...

Page 58: Learn & Get

Oggi c’è sempre più richiesta di applicazioni Oggi c’è sempre più richiesta di applicazioni con UI “ricche”con UI “ricche”

Applicazioni Windows “Smart”Applicazioni Windows “Smart”

Offrono tutti i vantaggi di un applicazione Offrono tutti i vantaggi di un applicazione Win32Win32

Hanno la capacità di auto aggionarsiHanno la capacità di auto aggionarsi

CaratteristicheCaratteristiche

Hanno la capacità di interagire con Hanno la capacità di interagire con l’hardware e il software installatol’hardware e il software installato

Funzionano sia Online che OffLineFunzionano sia Online che OffLine

Utilizzano una nuova modalità di Utilizzano una nuova modalità di deployment/updatedeployment/update

Possono funzionare su diverse piattaformePossono funzionare su diverse piattaforme

ClickOnce - IntroduzioneClickOnce - Introduzione

Page 59: Learn & Get

ClickOnce - CaratteristicheClickOnce - Caratteristiche

ClickOnceClickOnceSupporta il deploy e update di applicazioni .NETSupporta il deploy e update di applicazioni .NET

CD-RomCD-Rom

Percorso di retePercorso di rete

FTPFTP

WEBWEB

Integrata in Visual Studio 2005Integrata in Visual Studio 2005

Debug e Intellisense in ZoneDebug e Intellisense in Zone

Permission richiestePermission richieste

Permission calculatorPermission calculator

Deploy Online e OfflineDeploy Online e Offline

Update allo startup o programmaticoUpdate allo startup o programmatico

System.DeploymentSystem.Deployment

RegFree COM RegFree COM

Page 60: Learn & Get

Slides? Slides?

http://download.manageddesigns.it/classes/http://download.manageddesigns.it/classes/VBLearnAndGetVBLearnAndGet