I have just watched the live PDC05 Keynote Webcast. I'm very impressed. Great demo's showing LINQ, Indigo, Atlas and Avalon. The problem for Microsoft will be to get us 'the developers' to use these new technologies as soon as possible. I'm afraid it is all to much for a 'normal' developer too cope with.
I will be speaking at the SDN Software Developer Event on the September 16 2005, De Reehorst - Ede . I will talk about the integration of NDoc with Visual Basic 2003 and 2005. Hope to see you there.
- C# 2.0
- Class Designer
- Unit Testing
- Code Coverage
- FXCop Integration
- Debugging: DataTips, Visualizers and Viewers
- Refactoring
- Improved IntelliSense
- Code Snippets
- Profiles
- Strongly-typed resource class generator
- Improved (not perfect) Windows Forms controls
Microsoft has released a free LibCheck tool that allows you to compare two versions of an assembly, and determine the differences. The tool reports the differences as a combination of 'removed' and 'added' APIs. The tool is limited to looking only at APIs (i.e, it can't check for behavioral changes), and only compares public differences, or changes which are deemed to be 'breaking'. The tool can be used to quickly determine what has changed between one version of your assembly and another, and can help ensure that you won't introduce any breaking changes to clients of your assembly. Instructions and intended use of the tool are described in the 'libcheck tool specification' document with the zip file.
This was a feature I always was missing. VB6 had this, VS.NET didn't. Thanks MS.
I received a mail today from Rolf Gasber asking me whether I could help him with a VB.NET version of the AsyncHelper which I used in an earlier post. Here it is:
Public
Class
AsyncHelper
Private
Delegate
Sub
DynamicInvokeShimProc(
ByVal
d
As
[Delegate], _
ByVal
args()
As
Object
)
Private
Shared
_dynamicInvokeShim
As
_
New
DynamicInvokeShimProc(
AddressOf
DynamicInvokeShim)
Private
Shared
_dynamicInvokeDone
As
_
New
AsyncCallback(
AddressOf
DynamicInvokeDone)
Public
Shared
Sub
FireAndForget(
ByVal
d
As
[Delegate], _
ByVal
ParamArray
args()
As
Object
)
_dynamicInvokeShim.BeginInvoke(d,
args,
AddressOf _
DynamicInvokeDone,
Nothing
)
End
Sub
Private
Shared
Sub
DynamicInvokeShim(
ByVal
d
As
[Delegate], _
ByVal
args()
As
Object
)
d.DynamicInvoke(args)
End
Sub
Private
Shared
Sub
DynamicInvokeDone(
ByVal
ar
As
IAsyncResult)
_dynamicInvokeShim.EndInvoke(ar)
End
Sub
End
Class
For a long time I thought that I only had to set the Cursor.Current to a WaitCursor before a long running operation, the .NET runtime would reset it back to the Default cursor. Turns out that this is only true when the mouse is moved. Bummer.
Cursor.Current = Cursors.WaitCursor;
The solution for this problem is very easy. I created a helper class called WaitCursor which set the Cursor.Current and restores it to the original value when it it disposed.
public
sealed
class WaitCursor : IDisposable {        
 private Cursor _prev;
 public WaitCursor(){
   _prev= Cursor.Current;
   Cursor.Current = Cursors.WaitCursor;
 }
 publicvoid Dispose(){
   Cursor.Current =_prev;
 }
}
I create the instance of the WairCursor class inside a using statement. This will automatically call the Dispose() method when it goes out of scope.
Microsoft has invented a new name Micro-ISV, which are software companies that are comprised of only one person. So, I'm a Micro-ISV. Planning to launch my product this year. I hope to succeed.
There is a difference in disposing Modal and Non-Modal forms. In a training I gave last week I noticed that even experienced developers didn't know that Modal Dialogs don't dispose automatically, Non-Modal do.
private
void
buttonShowNonModalForm
(
object
sender
, System.EventArgs e){
 new TestForm().Show();
}
privatevoidbuttonShowModalDialog(objectsender, System.EventArgs e){
 new Form2().ShowDialog();
}
The solution to this problem is very simple by creating the Form instance within a using block. This will dispose the Form when it is closed.
private
void
buttonShowModalDialog
(
object
sender
, System.EventArgs e){
 using(TestForm f =new TestForm()){
   f.ShowDialog();
 }
}
An alternative solution uses a try/finnaly. Personally I prefer the previous, it is easier to read and write.
look.