Professional Documents
Culture Documents
v2
1/22/09
1:31 PM
Page 1
E N T E R P R I S E
S O L U T I O N S
F O R
.N E T
D E V E L O P M E N T
RETIRE YOUR
DATA CENTER
Use Azure Services to Maximize Availability,
Reliability, and Scalability.
PLUS
Use Iterators in VB
Project5
12/11/08
4:42 PM
Page 1
BeTheDataGuru
Visual Studio
WPF/Silverlight
SharePoint
SQL Server
Java
COM
PowerShell
Project5
12/11/08
4:43 PM
Page 2
Visit softwarefx.com for interactive demos and more information about our latest products.
Project4
6/2/08
12:13 PM
Page 1
0209vsm_TOC_3-4.v10
1/22/09
1:33 PM
Page 3
Contents
February 2009 VOLUME 19 NO. 2
C O LU M N S
C# CORNER
14
D E PA RT M E N T S
11 First Looks
Product Listings ..........................................................11
Review ............................................................................13
39 Index of Advertisers
32
0209vsm_TOC_3-4.v10
1/22/09
1:33 PM
Page 4
Online
Check out these and other exclusive online articles and tutorials on the Visual Studio Magazine Web site at
VisualStudioMagazine.com
Content
LEARN FROM THE PROS
As a developer you are constantly
facing the problem of how to keep up
with all the new technologies being
released while still getting your job
done. You keep hearing about solutions
to your programming problems but
the question is: are they the right
solutions for your particular needs?
You could spend hours or even days
trying to find the answers yourself, or
you could let the experts do it for you.
Redmond Media Group Events offers a
variety of conferences and shows
where you can learn about new
technologies and what they might offer you, attend in-depth workshops that
focus on topics specific to your needs, ask questions of the experts, and
interact with your peers to discuss problems they face and what solutions
theyve come up with. Whether its Web design, .NET development, or SQL
Server programming, weve got an event that matches your needs. Visit
RedmondEvents.com to learn more about upcoming conferences and shows.
ONLINE ARTICLES
Classic VB Corner:
Executing Debuggables
Have you ever had one of those problems that only
manifests itself in a compiled EXE, that you simply cant
reproduce in the Classic Visual Basic IDE? Or even worse,
that only occurs on the clients machines, and not on
yours at all? Karl E. Peterson shares his debugging
technique that works in both the IDE and EXE.
LOCATOR+ CODE: VS0902KP1
VirtualizationReview.com
1105 Media recently launched
a new Web site devoted
exclusively to covering all
aspects of IT virtualization.
Virtualization Review.com
helps you harness the power
of virtualization by delivering
news and in-depth coverage of the products, vendors,
issues, and technologies transforming IT through
virtualization. The site also features articles, tips, and
timely information about all aspects of virtualization
including servers, storage, desktops, applications, and
more. Visit VirtualizationReview.com now to start your
move to a more efficient, powerful virtual environment.
Project17
1/19/09
5:25 PM
Page 1
LEADTOOLS Document
Imaging v 16:
by LEAD Technologies
LEADTOOLS Document Imaging has every
component you need to develop powerful
image-enabled business applications including
specialized bi-tonal image display and
processing, document clean up, high-speed
scanning, advanced compression (CCITT
New
G3/G4, JBIG2, MRC, ABC) and more.
Version
Multi-threaded OCR/ICR/OMR/
16!
MICR/Barcodes (1D/2D)
Forms recognition/processing
PDF and PDF/A
Paradise #
L05 03201A01 Annotation (Image Mark-up)
C/C++, .NET, WPF - Win32/64
$
99
programmers.com/lead
2,007.
Paradise #
D77 09101L01
1,444.99
1,033.
99
949.
View Premier
Paradise #
V55 66101A01
CALLI
VDI Included
programmers.com/vmware
TX Text Control 14
by /n software
New
Word Processing Components
Release!
TX Text Control is royalty-free,
robust and powerful word processing
software in reusable component form.
Paradise #
I21 02201A01
Paradise #
I0M 02501F01
New
Release!
by FairCom
1,689.
Single Server
Paradise #
D29 02101A07
c-treeACE Professional
by Acresso
99
programmers.com/acresso
Paradise #
F01 0131
711.99
919.
programmers.com/theimagingsource
Mindjet MindManager 8
by Mindjet
Do you harness the wealth of data,
Web pages, and other input that comes
your way every day? Is there a way to
use it more effectively to formulate new
ideas, sharpen your focus, and ultimately
drive your success? New MindManager 8
for Windows is the answer.
New
Release!
for Windows
1 User
Paradise #
F15 17301A02
$
299.99
programmers.com/mindjet
196.
Infragistics NetAdvantage
for .NET 2008 Volume 3
Telerik RadControls
Multi-Edit 2008
by Telerik
by Infragistics
NetAdvantage for .NET is our comprehensive
suite of ASP.NET, Windows Forms, WPF
and Silverlight line of business controls,
components, and tools for the .NET platform.
NetAdvantage for .NET has what you need
to add no-touch AJAX to your Web site,
awesome power and performance to your
Windows Forms application, compelling user
experiences leveraging Windows Presentation
Foundation, and professionally polished user
interfaces (UI).
programmers.com/infragistics
800-445-7899
Prices subject to change. Not responsible for typographical errors.
648.
New
Release!
1-49 User
Paradise #
A30 01201A02
161.99
programmers.com/multiedit
programmersparadise.com
0209vsm_EdNote_6-8.v5
1/22/09
Editors
1:42 PM
Page 6
Note
CALCULATING
THE COST OF CHANGE
BY PATRICK MEADER
editor in chief
redo an edit Ive already done.It doesnt happen often,but it happens,and I tend to react to such events in a consistent manner.
I curse fiercely. I berate myself for not taking better precautions. Then I curse some more as I try to rescue the file.
Will it open in notepad, perhaps? Will a different USB port be
able to see the portable storage device? Experience tells me Im
better off knuckling down and just getting to work, but Im usually too worked up to sit down and start anew immediately. I
should take up yoga or meditation, learn a calming mantra. A
better man might seek solace from his spouse, but I dont want
sympathy or empathy at such times. No, I want to break stuff,
to throw the offending computer out the window. I want to
smash things.
Given how much I hate to redo stuff, I know one thing
definitively: Id hate to be a developer. Having to revisit and
rewrite a half-dozen applications every time the company that
makes my software tools changes something would leave me
feeling queasy; having to retool everything Ive ever done
because of far-reaching changes would mean a weeks-, if not
months-long stream of invectives to make David Mamet
blush. Id be in a semi-permanent rage state, tucked away in a
back office or closet so no one else would have to listen to me.
Its one thing to redo something because I made an error; its
quite another to be forced to redo something because someone else makes a change thats in my best interests,especially
if that change alters how I must approach my job.
But such changes happen all too often in software development. In her column last issue (Ask Kathleen, Windows
Workflow Changes Direction, January 2009), Kathleen Dollard tackled the extensive changes Microsoft is making in the
next version of Windows Workflow Foundation (WF). She
noted how many of the changes planned for version 4 will
break existing WF 3.5 applications, and urged that you put off
developing new WF-based applications if you havent begun
creating them already. She also provided several tips for mini-
mizing the transition to the next version of WF. In her opinion, developers will win over the long run, but she also
acknowledges that the price to achieve these gains is steep.
This months Letters to the Editor include a response to
Dollards article from Matt Fritz. Fritz laments the changes to
WF, as well as other, similar types of changes that hes experienced as a Microsoft developer (see Running the Development
Treadmill, p. 8). Fritz notes that hes a strong believer in the
Microsoft development platform, but goes on to say that using
[developers] as beta and field testers aint right. It costs us and
our companies time and money.
Hes right. These changes do carry a significant cost. The
flip side of his argument is this: Does Microsoft save Fritz
money in the long run by making these changes? The answer
is: It depends. For some developers, the changes will pay for
themselves handily over time; for others, the changes wont
provide the same return, whether because the developer doesnt
need the changes, or because the changes mean abandoning a
platform or technology theyve invested considerable time
and energy learning and deploying.
One positive aspect of the changes to WF is that theyre
occurring before the product matured. Another positive
aspect: WF is not a technology thats in widespread use, and
the current implementation is lacking in significant ways that
the next version will address. Theres a reason more people
dont use it now.
But what if youre one of those who made an investment
in the current version of WF? Microsoft is consciously throwing away the efforts of the developers and companies it convinced to adopt this technology. Its penalizing its own best,
most enthusiastic customersthe people, in fact, who had
paid money for WF. When discussing Microsofts approach to
WF with a couple advisors to VSM, the conversation would
usually start with Big Bad Microsoftfor doing this to its customers but eventually would swing back to discussing why
Project17
1/19/09
5:24 PM
Page 1
0209vsm_EdNote_6-8.v5
1/22/09
1:42 PM
Page 8
Project13
9/18/07
3:34 PM
Page 1
Get tips.
Get code.
Get the best how-to
articles on the net.
ONLINE
www.visualstudiomagazine.com
0209vsm_Letters_10.v7
1/22/09
1:37 PM
Page 10
Letters
Letters to Visual Studio Magazine are
welcome. Letters must include your
name, address, and daytime phone
number to be considered for publication. Letters might be edited for form,
fit, and style. Letters express the views
of the individual authors, and do not
necessarily reflect the views of the
editors, VSM, or 1105 Media. Please
send them to Letters to the Editor, c/o
Visual Studio Magazine, 230 California
St., San Francisco, CA 94111; fax
them to 415-814-0961; or e-mail
them to vsmedit@1105media.com.
VisualStudioMagazine.com
February 2009 Volume 19 No. 2
Editorial Staff
Vice President, Doug Barney
Editorial Director
Editor in Chief
Managing Editor
Guy Wright
Wendy Gonchar
Associate Managing
Editor, RMG
Katrina Carrasco
Contributing Editors
Andrew J. Brust, Ken Cox, John Cronan, Dan Fergus, John Gavilan,
Roger Jennings, Don Kiely, Martin Kulov, Jeff Levinson, Bill McCarthy,
John Charles Olamendy Turruellas, Keith Pleas, Peter Varhol, Bill Wagner
Art Staff
Creative Director Scott Shultz
Graphic Designer
Erin Horlacher
Online/Digital Media
Editor, VisualStudio Becky Nagel
Magazine.com
Executive Editor, New Media
Online News Editor
athleen Dollards article on the changes in the upcoming version of Workflow [Ask
Kathleen,Windows Workflow Changes Direction, January 2009] reminded me that the
same thing happened with SQL Server DTS 2000/2005, as well as with the MapPoint
object model and ADO. Now SQL Notification Services was dropped in 2008? Are you kidding? It
makes you wonder: How many times do you have to relearn things you used to know how to do?
Im a strong believer in the Microsoft developer platform, and I believe the tools do get
better over time. But using us as beta and field testers aint right. It costs us and our companies
time and money. Now I have Biztalk, Windows Communication Foundation, Windows
Workflow, and LINQ on the wait-and-see list, with more to come, no doubt. If Microsoft
still believes that developers are the foundation of its business, it needs to reconsider this
strategy. Gates himself talks about the great companies of yesteryear that couldnt see when
they started doing things wrong, like DEC, Wang, and Novell (and now General Motors?). Its
a mistake to alienate the developer community. Every company hasor will havea Toyota
in the rearview mirror.
Hey Bill! Come back for awhile; we need you to clean house!
Matt Fritz, originally posted online
Patrick Meader
Michael Domingo
Kurt Mackie
Gladys Rama
Shane Lee
Rita Zurcher
President
Henry Allain
President &
Chief Executive Officer
Senior Vice President
& Chief Financial Officer
Executive Vice President
Matt N. Morollo
Michele Imgrund
Tracy S. Cook
Videssa Djucich
Neal Vitale
Richard Vitale
Michael J. Valenti
Dick Blouin
Christopher M. Coates
Abraham M. Langer
Erik A. Lindgren
Carmel McDonagh
Jeffrey S. Klein
Correction:
The recent First Looks review of Compuwares DevPartner Studio contained an error when
discussing the capabilities of that tools Performance Analyzer [Understand What Your App
Does, January 2009]. Performance Analyzer can be configured to analyze ASP.NET applications
running on both local and remote computers. You can read an updated version of the review
online at VisualStudioMagazine.com that explains the general steps you need to take to use
Performance Analyzer with ASP.NET. Locator+ code: VS0901FL
VSM regrets the error.
10
0209vsm_FirstLooks_11-13.v7
1/22/09
1:39 PM
Page 11
First
PRODUCT LISTINGS
Looks
REVIEWS
DataDirect Technologies has released DataDirect Connect for ADO.NET data providers. With
DataDirect Connect for ADO.NET, developers
can write and deploy .NET enterprise applications that connect to multiple databases
including Oracle, DB2, Microsoft SQL Server, and
Sybase. The latest product release includes
new provider features for each major database,
new performance-tuning options, and introduces DataDirect Bulk Load, a standards-based
implementation of bulk-load functionality that
provides a method for moving volume-intense
data across Oracle, DB2, Microsoft SQL Server,
and Sybase databases, without having to
deploy and load client libraries.
The suite of ADO.NET data providers uses
a 100 percent managed code architecture,
therefore DataDirect Connect for ADO.NET
eliminates the need for database client
libraries. Because managed code runs in the
Common Language Runtime (CLR) environment it reduces risks and closes holes that
unmanaged code leaves exposed, providing
developers with versatile deployment
options available in both application and
client-server environments. With DataDirect
Connect for ADO.NET developers get full support for .NET Framework.
The latest release of DataDirect Connect
for ADO.NET additionally offers performance
enhancements including additional tuning
options that support a variety of application
performance scenarios and statement caching,
a connection option that requires no changes
to the application and can increase the efficiency of applications connecting to Oracle,
DB2, and Sybase.
DataDirect Connect for ADO.NET now supports Oracle 11g R2, SQL Server 2008, and
DB2 iSeries V6R1. A complete list of database
provider features is available online.
DataDirect Connect for ADO.NET
DataDirect Technologies
Price: Contact vendor for pricing
Web: www.datadirect.com
Phone: U.S.: 800-876-3101;
World: 44 (0) 1753 218 930
11
0209vsm_FirstLooks_11-13.v7
1/22/09
1:39 PM
Page 12
Instantly Search
Terabytes of Text
PRODUCT LISTINGS
REVIEWS
N dozens of indexed,
unindexed,
fielded data and
full-text search
options (including
Unicode support
for hundreds
of international
languages)
character sets. All three editions of List & Label can be integrated into a
large variety of programming languages.
List & Label 14
Combit GmbH
Price: Standard Edition is available for 370 euro; Subscription Editions Professional starts at 1,380 euro; and Enterprise at 2,094 euro.
Web: www.combit.net/en
N file parsers /
converters for
hit-highlighted
display of all
popular file
types
N Spider supports
static and
dynamic web
data; highlights
hits while
displaying links,
formatting and
images intact
h Spider
Desktop wit
h Spider
Network wit
CD/DVDs
Publish for
pider
Web with S
Win & .NET
Engine for
Linux
Engine for
New
64-bit
Resco has released an updated suite of controls and libraries for .NET
Compact Framework (CF) developers targeting Pocket PCs, smartphones, and Windows CE .NET devices. The new suite, MobileForms
Toolkit 2009, is optimized for Microsoft Visual Studio 2008 and
Microsoft .NET CF 3.5. Major enhancements to the suite include adding
Touch functionality to all controls and a new graphical user interface.
Adding Touch functionality to mobile applications is a simple matter of
setting up a single property in Microsoft Visual Studio.
MobileForms Toolkit 2009 includes many controls and libraries that
tackle most of the common problems that developers encounter developing for the mobile environment. Tools include SmartGrida grid control with built-in auto edit capabilities, Touch scroll support, and the
ability to save different SmartGrid layouts to XML files; AdvancedList
a professional list control suitable for small displays of mobile devices
and includes DelayLoad functionality that loads only visible data for
fast previews while additional data is loaded on demand; CompactCharta charting control with five chart types including Pie, Bar,
Line, Doughnut, and Area charts; OutlookWeekCalendar and OutlookMonthCalendarday/week and month/year appointment scheduling
controls; OutlookDateTimePickera modern version of a common control providing advanced styles; DetailViewfor creating mobile user
input forms where input controls are collected in a compact environment giving the form standard Windows Mobile look and feel; InkBox
an ink control suitable for quick notes or signatures; ImageBoxan
image control supporting various graphic formats; CustomKeyboarda
flexible control supporting custom keyboard layouts; OutlookShortcutBara popular shortcut control common for all modern applications; a
library for playing and recording audio; and more.
For more information about the Resco MobileForms Toolkit 2009 and
a complete list of controls and libraries, visit http://tinyurl.com/9wukrz.
MobileForms Toolkit 2009
Resco
Price: Standard Edition $499.95, Professional Edition $999.95,
Enterprise Edition $1,999.95
Web: www.resco.net
Fax: +421 2 090 2010
Editors Note: Please send product information to New Products Editor, c/o
Visual Studio Magazine, 230 California St., San Francisco, CA 94111; Phone:
415-814-0950, fax: 415-814-0961; e-mail vsmedit@1105media.com.
1-800-IT-FINDS www.dtsearch.com
0209vsm_FirstLooks_11-13.v7
1/22/09
PRODUCT LISTINGS
1:39 PM
Page 13
REVIEWS
13
0209vsm_F1Retire_14-25.v13
F E AT U R E
1/22/09
1:41 PM
Page 14
R E T I R E Y O U R D ATA C E N T E R
Retire
Your Data
Center
Visual Studio 2008, ASP.NET, and the Azure Services Platform
combine to simplify local development of data-intensive Web
apps and automate their deployment in Microsoft data centers.
The result: You get maximized availability and reliability with
almost limitless on-demand scalability, while you pay only for
resources consumed. BY ROGER JENNINGS
T
VB.NET
C#
SQL Server
ASP.NET
XML
Other:
Azure Services
Platform
Elastic Compute
Cloud (EC2)
14
TECHNOLOGY TOOLBOX
0209vsm_F1Retire_14-25.v13
1/22/09
1:41 PM
Page 15
R E T I R E Y O U R D ATA C E N T E R
FIGURE 1 Move ASP.NET Web Apps to the Cloud The foundation for the Azure
Services Platform is the Windows Azure operating system, which provides the fabric
for virtualized Windows 2008 Server instances; schemaless persistent table, blob,
and queue storage; .NET Services for managing authentication/ authorization, interservice communication, and workflows; and SQL Services for data management with
relational database features and consumer-oriented Live services. Like the Google
App Engine, Azure provides a development environment that emulates its cloud
operating system and storage services.
15
0209vsm_F1Retire_14-25.v13
1/22/09
1:41 PM
Page 16
R E T I R E Y O U R D ATA C E N T E R
Windows Azure runs on Windows Server 2008 with virtualization provided by Microsofts Hyper-V hypervisor technology
to deliver a runtime fabric that handles load balancing, data
replication, and resource management. According to Microsofts
Erick Smith, the Azure Fabric Controller maintains a graph of
the inventory of physical and virtual machines, load balancers,
routers, and switches it manages in a Microsoft data center. Edges
of the graph are interconnections of various types, for example,
network, serial, and power cables. You specify the topology of
your servicethe number and connectivity of roles, the attributes and locations of the various hardware components, as well
as the numbers of fault/update domains and maximum
instances of each role you need with a declarative Service Model.
In this respect, Windows Azure management features are similar
to those offered by RightScale for AWS and employed by the
GAE. Roles are runnable components of an application; role
instances run on the fabrics nodes and channels connect roles.
16
0209vsm_F1Retire_14-25.v13
1/22/09
1:41 PM
Page 17
R E T I R E Y O U R D ATA C E N T E R
value="Eby8vd MGw=="/>
<Setting name="BlobStorageEndpoint"
value="http://127.0.0.1:10000/"/>
<Setting name="QueueStorageEndpoint"
value="http://127.0.0.1:100001/"/>
<Setting name="TableStorageEndpoint"
value="http://127.0.0.1:10002/"/>
<!-- <Setting name="AccountName"
value="<youraccountname>"/>
<Setting name="AccountSharedKey"
17
0209vsm_F1Retire_14-25.v13
1/22/09
1:41 PM
Page 18
R E T I R E Y O U R D ATA C E N T E R
<WebRole name="WebRole">
<InputEndpoints>
<!-- Must use port 80 for http and port 443 for
https when running in the cloud -->
<InputEndpoint name="HttpIn"
protocol="http"
port="80" />
</InputEndpoints>
<ConfigurationSettings>
<Setting name="AccountName"/>
<Setting name="AccountSharedKey"/>
<Setting name="BlobStorageEndpoint"/>
<Setting name="QueueStorageEndpoint"/>
<Setting name="TableStorageEndpoint"/>
</ConfigurationSettings>
</WebRole>
</ServiceDefinition>
FIGURE 4 Manage Local Developer Fabric and Storage Instances This multiple
exposure screen capture shows log data for three instances of this articles
SampleWebCloudService project running in the Development Fabric and emulated
Azure Storage Services for blobs, queues, and Azures schemaless Entry-AttributeValue tables. A local SQL Server 2005+ Express instance holds a DevelopmentStorageDb database to store blobs, queues, and account information as
well as a ProjectName database containing Azure Table Services data. Starting
up the Development Fabric and Development Services slows VSs compile and
run operations significantly.
18
0209vsm_F1Retire_14-25.v13
1/22/09
1:41 PM
Page 19
R E T I R E Y O U R D ATA C E N T E R
Server Data Services (SSDS) CTPs Authority-ContainerEntity (ACE) model, which has been incorporated
into Windows Azure as SQL Data Services (SDS).
The EAV data model is much more scalable than
conventional file system-based relational tables. Azure
tables have a distributed architecture thats related
to Googles Bigtable, and Microsoft says Azure tables
are designed to scale to billions of entities and
terabytes of data. Azure and SDS table versions offer
free-form open properties (formerly flex properties) or property bags and permit adding or removing table attribute/value pairs at will. However, the
two versions have different required properties and
sets of data types.
Azure tables require PartitionKey and RowKey
string property values to form a concatenated primary
key and automatically add a DateTime Timestamp
property value to each entity. SDS entities require a
unique Id property value, permit an optional Kind
property, and supply an autoincrementing Version
FIGURE 5 Stage Azure Apps for Testing before Production Deployment
value for concurrency management.
Azure tables support Binary, Bool, DateTime, Windows Azures Click-Twice deployment approach lets you test your project in
Double, GUID, Int, Long, and String data types; SDS a Staging instance with a private guid.cloudapp.net URL before placing it in prooffers Base64Binary, Blob, Boolean, DateTime, Deci- duction with your AccountName.cloudapp.net URL. Right-clicking on the Projectmal, and String data types. SimpleDB property values Name service node and choosing Publish opens a page that lets you browse for
are limited to strings and require padding numbers your project ProjectName.cspkg package and ServiceConfiguration.cscfg files in
with leading zeros and adding offsets for negative val- the projects \ProjectName\bin\Debug\Publish folder. Clicking OK exposes the
ues, which complicates client programming. My Hosted Service page with the Staging instance in Allocated mode. Click Run to
Comparing Google App Engine, Amazon SimpleDB, start the staged service, test it with the private URL, click Suspend, and then
and Microsoft SQL Server Data Services blog post click the exchange icon to place it in production.
provides a detailed comparison of those three services
(see Additional Resources, p. 25).
Azure tables and SDS containers are units of consistency
Progress Toward Standards
and have a size limit of 2GB; SimpleDB domains, which correMicrosofts data-access teams are moving to standards-based
spond approximately to Azure tables, hold a maximum of 10GB.
RESTful data access protocols at an increasingly rapid pace.
Azure tables and SDS containers have strong consistency; all
Azure tables, blobs, and queues have a REST API, while SDS and
observers see the same value immediately after an update; special
SimpleDB provide REST and SOAP protocols.
algorithms guarantee consistency over multiple replicas. SimAzure tables and SDS use a new version of the ADO.NET
pleDB domains promise eventual consistency after a period with
Data Services (Astoria) runtime, which supports open propno new updates, but Amazon doesnt specify the inconsistent
erties with the Atom syndication wire protocol and operates
windows maximum duration.
with the existing ADO.NET Data Services client libraries and
Transactions are crucial for online order processing and
tools. Pablo Castros ADO.NET Data Services in Windows
other business applications, but neither Azure nor SimpleDB
Azure: pushing scalability to the next level blog post describes
tables currently support transactions. However, the Azure team
how the Astoria team modified the runtime to accommodate a
promises that their tables will at some point in the future perdynamic open properties provider for Azure and SDS, in addiform atomic transactions across multiple entities within the
tion to the static CLR types defined by the more common Entity
same partition. Partitions are similar to Bigtables tablets with
Framework and LINQ to SQL data providers (see Additional
some characteristics of the App Engines entity groups thrown
Resources, p. 25).
in; a single VM or server stores all entities in the table with the
The REST API for Azure defines HTTP GET (query), POST
same PartitionKey value. (App Engine offers transactions for
(create), PUT (update with properties replaced), MERGE (update
entities in the same Entity Group.) The CTP provides equality
without properties replaced), and DELETE operations on entities.
filters only and sorts in PartitionKey/RowKey order; inequality
Heres the GET request header for the second page of the sample
filters and developer-specified secondary indexes for alternative
projects Customers GridView, which starts with CENTC as the
sorting orders are slated for the release version.
CustomerID and RowKey value:
19
Project1
1/21/09
11:14 AM
Page 1
Project1
1/21/09
11:15 AM
Page 2
0209vsm_F1Retire_14-25.v13
1/22/09
1:41 PM
Page 22
R E T I R E Y O U R D ATA C E N T E R
GET /CustomerTable()?$top=12&NextPartitionKey=
Customer&NextRowKey=CENTC HTTP/1.1
User-Agent: Microsoft ADO.NET Data Services
x-ms-date: Fri, 19 Dec 2008 23:37:31 GMT
Authorization: SharedKeyLite oakleaf:Z/KA 5Yc=
Accept: application/atom+xml,application/xml
Accept-Charset: UTF-8
$top operator. The Atom-formatted response body includes xms-continuation-NextPartitionKey and x-ms-continuationNextRowKey continuation tokens to identify the first entity of
the next page. Optimistic concurrency management uses eTags
and Timestamp values to detect conflicts with If-Match HTTP
headers. Heres the GET response header and abbreviated body
of the second GridView page:
DataServiceVersion: 1.0;NetFx
MaxDataServiceVersion: 1.0;NetFx
HTTP/1.1 200 OK
Host: oakleaf.table.core.windows.net
Cache-Control: no-cache
Content-Type: application/atom+xml;charset=utf-8
standalone="yes"?>
<feed xml:base=
"http://oakleaf.table.core.windows.net/"
xmlns:d="http://schemas.microsoft.com/
ado/2007/08/dataservices"
xmlns:m="http://schemas.microsoft.com/
ado/2007/08/dataservices/metadata"
xmlns="http://www.w3.org/2005/Atom">
<title type="text">CustomerTable</title>
<id>
http://oakleaf.table.core.windows.net/
CustomerTable
</id>
<updated>2008-12-19T23:37:01Z</updated>
<link rel="self" title="CustomerTable"
href="CustomerTable" />
<entry m:etag="W/"datetime'2008-129T22%3A10%3A30.2752Z'"">
<id>
http://oakleaf.table.core.windows.net/
CustomerTable(PartitionKey='Customer',
RowKey='CENTC')
FIGURE 6 Try the Live Table Services Sample Project You can run this articles
SampleCloudWebService.sln project in the Azure Services Platform CTP at
oakleaf.cloudapp.net. The Default.aspx page contains a paged GridView that
displays 12 Northwind Customers records per page and a FormView for
inserting new entities; both controls are bound to an ObjectDataSource that
connects to an Azure table. (The projects FormView is disabled in the public
version.) The Count button iterates the entity set; clicking on Delete All
Customers deletes the table and Create Customers recreates the table and
adds Customer entities. Update Customers toggle the addition or deletion of
a plus sign (+) after the CompanyName. The Time textbox displays the
elapsed time of the server components of these operations.
</id>
<title type="text"></title>
<updated>2008-12-19T23:37:01Z</updated>
<author>
<name />
</author>
<link rel="edit" title="CustomerTable"
href="CustomerTable(PartitionKey=
'Customer',RowKey='CENTC')" />
<category term="oakleaf.CustomerTable"
scheme="http://schemas.microsoft.com/
ado/2007/08/dataservices/scheme" />
22
0209vsm_F1Retire_14-25.v13
1/22/09
1:41 PM
Page 23
R E T I R E Y O U R D ATA C E N T E R
</entry>
</feed>
<m:properties>
<d:PartitionKey>Customer</d:PartitionKey>
<d:RowKey>CENTC</d:RowKey>
<d:Timestamp m:type="Edm.DateTime">
2008-12-19T22:10:30.2752Z
</d:Timestamp>
<d:Address>
Sierras de Granada 9993
</d:Address>
<d:City>Mxico D.F.</d:City>
<d:CompanyName>
Centro comercial Moctezuma
</d:CompanyName>
<d:ContactName>
Francisco Chang
</d:ContactName>
</m:properties>
</content>
Feature
Host OS
Guest OS
Hypervisor
Hyper-V
Xen
CPU
1.7GHz
Memory
1.7GB
1.75GB
Network
100Mbps
250Mbps
Transient storage
250GB
160GB
Persistent storage
Authentication/
Authorization
NET Access Control: LiveID, username/ password, X.509 certs, Information Card
TABLE 1 Compare Windows Azure October 2008 CTP and Amazon EC2 with Windows Server Beta On Sept. 30, 2008, Amazon.com Inc.
announced the availability of a public beta version of its Elastic Compute Cloud (EC2) with Windows Server 2003. The default Amazon
Machine Image (AMI) creates a 32-bit small instance with IIS, .NET 2.0 SP1, 3.0 SP1, and 3.5 (not SP1), and SQL Server Express 2005. The
Azure Services Platform October 2008 community technology preview provides services similar to Amazon EC2 with Windows Server (beta)
plus SimpleDB (beta), Simple Storage Services (S3), Simple Queue Services (SQS), and Elastic Block Store. This table compares the Azure CTP
instance and Amazon EC2 beta default instances.
23
0209vsm_F1Retire_14-25.v13
1/22/09
1:41 PM
Page 24
R E T I R E Y O U R D ATA C E N T E R
string.Format("?ct={0}/{1}", nextPartition,
EventArgs e)
nextRow);
{
// This LINQ to REST query gets a page of 12
var query =
customersView.DataBind();
(DataServiceQuery<CustomerDataModel>)
(new CustomerDataServiceContext(account).
CustomerTable.Take(12));
// Get the continuation tokens from the request
var cTokens = Request["ct"];
Youll also need code like this that runs once for each session in the
Global.asax.cs file to create the initial table from your TableName
DataModel class:
if (cTokens != null)
{
StorageAccountInfo account =
// ct parameter format is "<partition>/<row>"
StorageAccountInfo.
GetDefaultTableStorageAccountFromConfiguration();
TableStorage.CreateTablesFromModel
(typeof(CustomerDataServiceContext), account);
qor.Headers.TryGetValue(
"x-ms-continuation-NextRowKey", out nextRow);
if (nextPartition != null && nextRow != null)
{
24
0209vsm_F1Retire_14-25.v13
1/22/09
1:41 PM
Page 25
R E T I R E Y O U R D ATA C E N T E R
Setting Up the Windows Azure Services Platform: An Illustrated Walkthrough OakLeaf blog post: tinyurl.com/65wywn
Ray Ozzie and Amitabh Srivastava PDC 2008 Day One Keynote video
(Channel9): tinyurl.com/5tsgvm; transcript: tinyurl.com/5vhprm
Video clips of 39 Azure-related sessions at PDC 2008 (Channel9):
tinyurl.com/5vd7cr
Video clips of eight SQL Data Services-related sessions at PDC 2008
(Channel9): tinyurl.com/638uoo
Azure SDK online documentation: tinyurl.com/6yy75b
SQL Services Labs home page with planned incubation projects for SDS
tinyurl.com/5asfdm
Windows Azure TablesProgramming Table Storage white paper:
tinyurl.com/59tlo7
Windows Azure TablesProgramming Blog Storage white paper:
tinyurl.com/6785ra
Issues and Constraints in the Windows Azure Tools and SDK white
paper tinyurl.com/4m92h9
The Atom Syndication Format (1.0) specification (IETF RFC 4287):
tinyurl.com/ysewpe
Amazon Elastic Compute Cloud (EC2) Running Microsoft Windows Server
and SQL Server (Beta) data sheet: tinyurl.com/4xw9cw
Amazon Elastic Compute Cloud (Amazon EC2) data sheet:
http://tinyurl.com/4bw86s
ADO.NET Data Services in Windows Azure: pushing scalability to the next
level blog post by Pablo Castro tinyurl.com/4ky4x2
Comparing Google App Engine, Amazon SimpleDB and Microsoft SQL
Server Data Services OakLeaf Systems blog post: tinyurl.com/626td8
Test Harnesses Compare Amazon EC2 with SQL Server and SimpleDB
Performance OakLeaf Systems blog post: http://tinyurl.com/5ea99x
SQL Data Services (SDS) Test Harness Updated to the Windows Azure
Services Platform OakLeaf Systems blog post: tinyurl.com/58tw7c
Test-Drive SQL Server Data Services by Roger Jennings: Locator+ Code
VS0807RJ_T
Manipulate Data in the Cloud by Roger Jennings: Locator+ Code
VS0805RJ_T
25
0209vsm_C#Corner_26-29.v8
1/22/09
C# CORNER
1:43 PM
Page 26
USING EXPRESSIONS
ve written before about how much I like lambda expressions and the way type inferences work
in C#. I think lambda expressions have more clarity than the combination of delegate definitions and out-of-band method definitions and the related extra work you have to do only to satisfy
the language definitions. But, there are some weaknesses. If a methods parameters contain the
System.Delegate abstract type, using lambda expressions introduces special problems: The C#
compiler cant convert a lambda to some not-yet-defined concrete, derived delegate type.
Without some extra thought on your part, youll end up with code that looks like it came from
.NET 1.0. Ill walk you through the exercise of understanding why lambda expressions arent immediately
convertible to abstract delegate types, and how you can convince the compiler to convert the specific
delegate type you defined for your use. The solution Ill describe relies on Windows Presentation
Foundation (WPF) and the System.Windows.Threading.Dispatcher component, but this is not strictly
a WPF issue. The issue described crops up in several locations in the .NET Framework, including the
Windows Forms, Office APIs, and Reflection APIs.Youll be able to follow the approach described in this
article when you see it crop up in those other technologies as well.
Whenever I use an API in the .NET Framework that has a parameter thats some form of delegate, I
prefer to use a lambda expression instead of a more verbose representation. For example, this line of code
creates a System.Windows.Threading.Timer that calls the method TickHandler when the timer fires:
TECHNOLOGY TOOLBOX
VB.NET
C#
SQL Server
ASP.NET
XML
26
ILLUSTRATION BY ISTOCKPHOTO.COM
0209vsm_C#Corner_26-29.v8
1/22/09
1:43 PM
Page 27
Whenever youre not sure what thread youre on, you can call
delegate method,
params object[] args)
Now consider what happens when you try to use a lambda expression for this call:
MyTime.Content = label;
Youll probably wonder whats going on the first time you see this
error. Of course, its a delegate type, right? Well, the compiler isnt
quite as smart as you are.The System.Delegate type is an abstract type,
and the type inference engine cant infer the number and types of the
arguments or the return value for some unknown delegate type
derived from System.Delegate. To fix this problem, you must create a
concrete delegate type and assign your lambda expression to that
type. Before you delve too far into the distant past and begin writing
C# 1.0 code, remember delegate types let you treat methods as data.
After declaring the variable,you can assign the delegate variable to the
body of the code you want to execute. You can use a lambda expression here because Action<T1, T2> is a concrete delegate definition:
updateTimer = (label, newBrush) =>
{
MyTime.Background = newBrush;
MyTime.Content = label;
};
Now youve got a member variable that points to the block of code
that you want to execute when the timer raises its event. All thats
left is to use the delegate definition with Dispatcher.Invoke():
27
0209vsm_C#Corner_26-29.v8
1/22/09
1:43 PM
Page 28
else
if (!MyTime.Dispatcher.CheckAccess())
updateTimer(newLabel, next);
{
MyTime.Dispatcher.Invoke(updateTimer,
28
0209vsm_C#Corner_26-29.v8
1/22/09
1:43 PM
Page 29
{
if (!widget.Dispatcher.CheckAccess())
widget.Dispatcher.Invoke(whatToDo, parm);
VS0902CC Read this article and download the sample code online.
else
whatToDo(parm);
}
public static void
InvokeIfNeeded<T1, T2>(this
Controlwidget, Action<T1, T2>
whatToDo,
T1 parm1, T2 parm2)
{
if (!widget.Dispatcher.
CheckAccess())
widget.Dispatcher.
Invoke(whatToDo,
parm1, parm2);
else
whatToDo(parm1, parm2);
}
}
Barcode
Mark-up
DICOM Medical
Multimedia
www.leadtools.com/vsm
GO ONLINE
29
San Francisco
Hyatt Regency Embarcadero
February 23-27, 2009
Visit the Exhibitor Expo and VIP Lounge & Game Center
(sponsored by ComponentOne)
Book signings with some of your favorite technical authors
VSL_VSM_Feb09.indd 1
1/20/09 12:43:30 PM
vslive.com/sf2009
Be sure to use priority code
NQ9F14 to get the 2 for 1 savings!
Meet these Experts in Person at VSLive! San Francisco:
2 FOR 1
SAVINGS!
UP TO
1800*
Deborah Kurata on
Visual Studio and .NET Framework Secrets
Deborah Kurata, president of InStep Technologies, .NET expert with over 15
years experience in application architecture, design and development, and
author of several books, including Best Kept Secrets in .NET.
Dave Bost on Prism, and a deep dive into ASP .NET 3.5 SP1
Bost, who has been a developer and solution architect for over 15 years,
is a Developer Evangelist with Microsoft and co-hosts the
Thirsty Developer Podcast.
* Choose either the VSLive! Plus Package (Five day all access pass Feb. 23-27), or the VSLive! Conference Package (Three day pass Feb 24-26). The Buy One Get
One FREE offer cannot be combined with other discounts or coupons. The second conference pass must be of equal or lesser value than the first conference pass.
VSL_VSM_Feb09.indd 2
1/20/09 12:43:35 PM
0209vsm_OnVB_32-38.v9
ON VB
1/22/09
1:36 PM
Page 32
I T E R AT O R S I N V B
n Visual Studio 10, Visual Basic and C# will officially attempt to converge rather than diverge.
The two languages are touted by Microsoft to have the same major language features as each
other; Microsoft also promises language parityand an end to the sibling rivalry.For C#, this
means the inclusion of long-standard VB features such as late binding and optional parameters.
For VB, it means the inclusion of multi-expression lambdas and auto properties. This parity is
not absolute: For example, C# wont have XML literals, making VB still the best language for working
with XML. One thing VB is not likely to get in the next release is iterators.
Iterators in C# are a language feature that enables you to write a complete implementation for an
enumerable object in a single method. An enumerable object is one that you can perform For Each
loops or LINQ queries on. Arrays, Lists, and Collections are all common examples of enumerable
objects. In fact, enumerable objects are so common in the .NET Framework that you rarely need to
define your own. Still, its important you understand the basics of what enumerable objects are and how
to create them should the need ever arise.
Lets kick things off with some common examples for iterators youll see in C#. The first is from the
C# documentation:
I
TECHNOLOGY TOOLBOX
C#
ASP.NET
{
for (int i = 0; i < items.Length; i++)
{
32
PHOTO BY ISTOCKPHOTO.COM
VB.NET
0209vsm_OnVB_32-38.v9
1/22/09
1:36 PM
Page 33
O N V B I T E R AT O R S I N V B
O B J E C T / R E L AT I O N A L M A P P I N G W I T H L I N Q R O S Q L
}
}
I hope youre laughing at that sample. If you arent, some explanation might help you see the humor. The code shows a method that
returns an IEnumerable: This is what an iterator is in C#. The yield
return statement indicates what is returned when the code is enumerated with a For Each loop or similar. So, this code iterates over
an array and returns each item in the array. In other words, it is
superfluous and just adds overhead, as an array is already enumerable. That method could have just returned the array cast to
an IEnumerable.
You might think thats just a one-off, bad-code example. Sadly,
I have seen many cases where iterator blocks are superfluous.
Superfluous code is an evil because it adds to the testing and maintenance burdens. But not all cases are superfluous. Bill Wagner in
his December 2008 C# column (What VB Devs Should Know
About C#) showed a good example of creating an iterator that will
give you the letters a to z as you enumerate it:
public static IEnumerable<char> Letters()
{
This is a little better, but there are other ways to approach this
problem, as well. A String is in fact enumerable and implements
IEnumerable(Of Char), so you can simplify everything to a single
string declaration:
Dim letters = "abcdefghijklmnopqrstuvwxyz"
33
0209vsm_OnVB_32-38.v9
1/22/09
1:36 PM
Page 34
O N V B I T E R AT O R S I N V B
VB
If strLine.Contains(value) Then
count += 1
resultList.Add(strLine)
If count >= 3 Then Exit Do
End If
strLine = myStreamReader.ReadLine
Loop
Module StreamExtensions
<Extension()> _
Function Lines(ByVal rdr As TextReader) _
As IEnumerable(Of String)
Return New StreamReaderLineEnumerator(rdr)
End Function
End Module
''' <summary>
''' Get's an enumerator to read lines from a stream
''' </summary>
''' <returns>IEnumerator(Of String)</returns>
''' <remarks>Can only be called once due to the
''' underlying stream.
''' Not thread safe.</remarks>
''' <exception cref="InvalidOperationException">
''' thrown if GetEnumerator is called more
''' than once</exception>
Public Function GetEnumerator() _
As IEnumerator(Of String) _
Implements IEnumerable(Of String).GetEnumerator
Static iFirstTime As Int32
If iFirstTime = 0 AndAlso _
Threading.Interlocked.Increment( _
iFirstTime) = 1 Then
Return Me
Else
Throw New InvalidOperationException( _
"GetEnumerator can only be called " & _
"once on a stream")
End If
End Function
LISTING 1 Most of what you see in the class is boilerplate code, with the two methods of interest being GetEnumerator and the MoveNext
method. This sample also illustrates how to add an extension method to make getting the enumerator a lot simpler. The extension method will
show up on an instance of the StreamReader class as a Lines function.
34
0209vsm_OnVB_32-38.v9
1/22/09
1:36 PM
Page 35
O N V B I T E R AT O R S I N V B
O B J E C T / R E L AT I O N A L M A P P I N G W I T H L I N Q R O S Q L
Where line.Contains(value) _
}
Take 3
I think that approach is a clear winner for the most beautiful solution. The difficulty is in creating the Lines extension method. If you
dont mind having a C# assembly as a reference, its a simple task to
create an Extension method thats an iterator:
VB
Private Function _
IEnumerator_GetEnumerator() As IEnumerator _
Implements IEnumerable.GetEnumerator
Return Me.GetEnumerator
End Function
Private ReadOnly Property IEnumerator_Current() _
As Object Implements IEnumerator.Current
Get
Return Me.Current
End Get
End Property
Public Sub Dispose() _
Implements IDisposable.Dispose
' not implemented
End Sub
End Class
LISTING 2 This class is most useful in VB10, where you can pass in a multi-statement lamba expression for the MoveNextFunc. You can use this
generic template in VB8 and VB9, but without support for multi-statement lambdas youll find that youll need to use AddressOf, and capture
variables used by making them fields of a wrapper class. As a consequence, youre better off using the direct implementation (Listing 1,
opposite page) rather than the generic template for versions of VB prior to VB10.
35
0209vsm_OnVB_32-38.v9
1/22/09
1:36 PM
Page 36
O N V B I T E R AT O R S I N V B
include the constructor (see Figure 1, p. 33). The good news is that
most of these methods are typically implemented with the same
boilerplate code. This means that you can streamline creating iterators in VB by using techniques such as snippets, templates, or
generic classes.
You must implement three methods for the IEnumerator
New 7.0
e
mag
DotI ease
Rel
Of T).Current
Get
Return m_Current
End Get
End Property
Private ReadOnly Property _
IEnumerator_Current() _
As Object _
www.atalasoft.com
36
Implements IEnumerator.Current
Get
Return Current
End Get
End Property
You must also implement IEnumerable(Of T). This includes a single function
(GetEnumerator), in which you return
your IEnumerator(Of T) implementation.
As part of the IEnumerable(Of T) interface, you must also implement the nongeneric IEnumerable interface. IEnumerable also has a GetEnumerator function,
0209vsm_OnVB_32-38.v9
1/22/09
1:36 PM
Page 37
O N V B I T E R AT O R S I N V B
O B J E C T / R E L AT I O N A L M A P P I N G W I T H L I N Q R O S Q L
The code you put inside the GetEnumerator method deserves careful consideration.
You need to think through how you expect
these implementations to be used, as well
as how they will behave in cases such as
multi-threaded environments or when
changes occur. Enumerators are normally
considered to be a snapshot. For example,
List(Of T)s enumerator will throw a runtime exception if the list is changed during
a For Each iteration. Other iterators might
just ignore changes. In the case of a stream,
your decision is a bit tougher.
You change a streams position as you
read from it. For example, if there are two
iterators reading from the one stream, the
results could be unpredictable, changing
depending on threading behaviors. There
are two ways around this problem: Use a
null stream and have the iterators return
no data, or throw an exception in GetEnumerator if it has been called previously.
Throwing an exception makes it easier to
debug what went wrong. Whichever
choice you make, take the time to document it by completing the XML comments
on the method:
37
0209vsm_OnVB_32-38.v9
1/22/09
1:36 PM
Page 38
O N V B I T E R AT O R S I N V B
and combine this with a generic template to give you the same
functionality from VB.
To do this, you need to define a delegate in your generic template that has the current item as a ByRef parameter:
Your generic iterator takes a delegate in its constructor, stores a reference to it, and calls that in the MoveNext method. Once you
define the GenericIterator class (see Listing 2, p. 35), you can use
this much as you use inline iterators in C#. For example, you can
create a line-by-line iterator with a StreamReader:
Threading.Interlocked.Increment(iFirstTime) = 1 Then
Return Me
Else
Throw New InvalidOperationException( _
"GetEnumerator can only be called once on a stream" )
End If
End Function
There are a couple of points worth discussing in this code. The code
relies on a static variable inside the code to check whether the
method has been called previously, and uses Threading.Interlocked.Increment to change the value. This ensures that it can be
called only once, even in a thread-race condition. If it has been
called more than once, an InvalidOperationException is thrown.
Note that the method returns a Me reference when called for the
first time. This is because the class implements both the IEnumerable(Of T) interface and the IEnumerator(Of T) interface. You can
separate them into different classes, but often its useful to have
them in a single class because you generally need to store some
shared state in them (see Listing 1, p. 34, for a complete example of
a StreamReaderLineEnumerator).
The VB version is obviously lengthier than the C# version,
but the VB version has some significant benefits. First, your
implementation is likely to be more robust because youve been
forced to look at the implementation details. Second, the C# version doesnt prevent GetEnumerator being called more than
once on the same stream. This could result in some obscure
threading problems. It could also produce seemingly null result
sets for files if the iterator is called twice. Or, it could potentially
result in some object-disposed exceptions occurring that arent
explicit in describing the real problem. The C# version does provide a quick-and-dirty way to write the iterators: The quick part
is inviting, but its often the dirty part that we spend a lot more
time cleaning up after.
Its important to note that iterators in C# arent always dirty.
Sometimes they do provide an elegant and clean way to express an
IEnumerable. And its likely VB will get a similar syntax in the
not-too-distant future. In VB10, you will be able to use multistatement lambdas that capture surrounding variables. If youre
willing to accept the same limitations that iterators have in C#,
then you can use a lambda as the basis for the MoveNext method
38
The lack of a formal syntax for iterators in VB doesnt mean you cant
create iterators in VB. In fact, the download for this article includes a
snippet,templates,and examples of how you can write iterators easily
in the current version of VB. The download also includes an example
that illustrates how to use a generic template and lambdas in VB10.
Using the downloadable snippet or templates in the current version of
VB, you can quickly create iterators that are more flexible and more
robust than what the C# iterator syntax allows for.
As LINQ and PLINQ become more a part of your programming, your reliance on iterators will increase, so nows a good time
to learn how to write them properly. Being exposed to the implementation details will give you a better understanding of iterators
and their pitfalls, which means youll be less likely to yield to the
temptation of using them poorly when the day comes that VB too
adds some syntactic sugar for creating iterators.
So grab these downloads and start writing your own iterators today. VSM
Bill McCarthy is an independent consultant based in Australia and
is one of the foremost .NET language experts specializing in Visual
Basic. Hes been a Microsoft MVP for VB for the last 10 years and sat
in on internal development reviews with the Visual Basic team for
the last five years where he helped to steer the languages future
direction. These days he writes his thoughts about language direction
on his blog at http://billmccarthy.com.
GO ONLINE
Use this Locator+ code at VisualStudioMagazine.com to go directly to these
related resources.
READ & DOWNLOAD
VS0902OV Read this article and download the sample code online.
0209vsm_AdIndex_39.v3
1/22/09
1:44 PM
Page 39
Advertising Sales
Ad Index
East
Atalasoft, Inc.
www.atalasoft.com
36
dtSearch
www.dtsearch.com
12
ESRI
www.esri.com
Andrew Mintz
National Sales Manager
Phone: 508-532-1433
amintz@1105media.com
Intel Corporation
www.intel.com
C4
West
28, 29
Chris Kourtoglou
Regional Sales Manager
Phone: 415-814-0955
ckourtoglou@1105media.com
Microsoft Corporation
www.microsoft.com
20, 21
Production Coordinator
Catharine Wood
Phone: 818-734-1520 ext 233
vsmadproduction@1105media.com
cwood@1105media.com
Copyright Statement
Copyright 2009 by 1105 Media, Inc. All rights reserved.
Printed in the U.S.A. Reproductions in whole or part prohibited except by written permission. Mail requests to
"Permissions Editor," c/o Visual Studio Magazine, 230
California St., San Francisco, CA 94111.
Legal Disclaimer
The information in this magazine has not undergone any
formal testing by 1105 Media, Inc. and is distributed without any warranty expressed or implied. Implementation or
use of any information contained herein is the reader's sole
responsibility. While the information has been reviewed for
accuracy, there is no guarantee that the same or similar
Software FX Inc.
www.softwarefx.com
37
C2, 1
TallApplications BV
www.deepseaobfuscator.com
TallComponents BV
www.tallcomponents.com
C3
ID Statement
Visual Studio Magazine (ISSN 1537-002X) is published
monthly by 1105 Media, Inc., 9121 Oakdale Avenue, Ste. 101,
Chatsworth, CA 91311. Periodicals postage paid at
Chatsworth, CA 91311-9998, and at additional mailing
offices. Complimentary subscriptions are sent to qualifying
subscribers. Annual subscription rates for non-qualified subscribers are: U.S. $34.97, Canada $52.97 (U.S. funds);
International $78.97 (U.S. funds). Subscription inquiries,
back issue requests, and address changes: Mail to: Visual
Studio Magazine, P.O. Box 1164, Skokie, IL 60076-8164,
email VSM@1105service.com or call toll free 888-768-8759,
fax number 847-763-9564. International calls 847-7639135. POSTMASTER: Send address changes to Visual Studio
Magazine, P.O. Box 1164, Skokie, IL 60076-8164. Canada
Publications Mail Agreement No: 40612608. Return
Undeliverable Canadian Addresses to Circulation Dept. or
Bleuchip International, P.O. Box 25542, London, ON N6C 6B2.
results may be achieved in all environments. Technical inaccuracies may result from printing errors and/or new developments in the industry.
Corporate Address
Corporate Headquarters:
1105 Media
9121 Oakdale Ave. Ste 101
Chatsworth, CA 91311
www.1105media.com
Media Kits
Direct your Media Kit requests to:
Matt Morollo, VP Publishing
Phone: 508-532-1418
Fax: 508-875-6622
E-mail: mmorollo@1105media.com
Reprints
Reprints: For single article reprints (in minimum quantities of
250-500), e-prints, plaques and posters contact:
PARS International
Phone: 212-221-9595
E-mail: 1105reprints@parsintl.com
Web: www.magreprints.com/QuickQuote.asp
List Rental
This publications subscriber list, as well as other lists from
1105 Media, Inc., is available for rental. For more information, please contact our list manager, Merit Direct.
Phone: 914-368-1000
E-mail: 1105media@meritdirect.com
Web: www.meritdirect.com
30, 31
Edit Ad Index
Combit GmbH
www.combit.net/en
11
DataDirect Technologies
www.datadirect.com
11
MadCap Software
www.madcapsoftware.com
13
Resco
www.resco.net
12
Go to
VisualStudioMagazine.com
to access the stories in this
issue, plus read exclusive
online-only content.
39
0209vsm_GuestOp_40.v8
1/22/09
The Human
1:38 PM
Page 40
Factor
BY DANIEL APPLEMAN
40
Project3
1/21/09
11:34 AM
Page 1
Project3
1/16/09
8:56 AM
Page 1
2009, Intel Corporation. All rights reserved. Intel and the Intel logo are trademarks of Intel Corporation in the U.S. and other countries. *Other names and brands may be claimed as the property of others.