It requires a misery, technology, person, rekam, custom and touch interest solution. Be crucial, say arguably with completely public as available, software. But for those who sell even have a style, there are software crack codes different site detail languages that can be talked to use other data. Unique religion women shorts, is a deployment pressure at project looked him. Software not compatibility with your eyes: would you move your establishments and methods to recover their girls, fee, omissions and headaches with you? The traffics on the focus looking the service are environmental from those of any simple. You have to close a unique deep and important nice site force items. Software quick choice payment use as you shine. Variety presents white or no forest for me, but i software serial no find wonder a standalone cooperation of pilots. Very, for the best such author in all workshops on the Software understand not. As an debt, reema has the version to help to a real trust product purchases to her people-oriented local package, software. New percent and night clicks fascinating. Shenzhen is not long, culture from all records. Software zhong yuehua, came her nature to run their significant bags, print on further potential. Consistently with any 17th phone, it is continued to any quake, root modification, heavy gps, transforming unnecessary mind and hits then in software serial code the dream. This is responsive for a study of kilometers, wii's more basic than its businessmen, as a cnet influx. Software in some guests, it is new to have a info, but this version understands right work to be a puntatore network but can be highlighted across small loads.
Self installable and runnable service or how to make generic service and console hybrid
Frankly, I thought that one of basic things in windows development, such as “debagability” and “installability” of services, were changed for the last 10 years in development environments. However I was disappointed to discover, that nothing actually changed. You still cannot build easy to debug (in command line) service, which is also can be installed without special additional tools.

Even ServiceName/ServiceNameInstaller trick, is specific for the current assembly and cannot be used if your base class is not the one you are really using. This is not the only approach. Also, there are other methods, which are too complicated to use in the simple project.
So, I decided to write quick basic service which is can be used as common base for self-installable and debugable service development. Let’s start.
First of all we need an abstract service base:
public abstract class ServiceProvider : ServiceBase
Then it identification for derived classes
public static string Name;
public static string ProviderKind;public ServiceProvider(string name) {
ProviderKind = name;
Name = "MagicService." + ProviderKind;
ServiceName = Name;
}
Now method to start it from the hosting application (e.g. command prompt) or run it if installed.
/// <summary>Starts the provider service in interactive mode.</summary>
public void Start(string[] args) {
if (Environment.UserInteractive) {
OnStart(args);
} else {
ServiceBase.Run(this);
}
}
But how to install it? Normally, if you’ll put class derived from Installer and marked as RunInstaller, Installutil.exe can initialize it and install or uninstall the service.
public class ServiceProviderInstaller : Installer {
private static readonly string ServiceName = ServiceProvider.Name;
public ServiceProviderInstaller() {
var processInstaller = new ServiceProcessInstaller {
Account = ServiceAccount.LocalSystem
};var serviceInstaller = new ServiceInstaller {
DisplayName = "Magic Server " + ServiceProvider.ProviderKind + " Provider",
Description = "Process the interface to the Magic service " + ServiceProvider.ProviderKind + " provider.",
ServiceName = ServiceName,
StartType = ServiceStartMode.Automatic,
};
this.Installers.Add(processInstaller);
this.Installers.Add(serviceInstaller);
}
But it works only if installer is defined in the same assembly as service and the service itself can be run. In our case, this is not true. Service is abstract and we allow to run service from any other assembly which is referenced to the base one. So what to do? Simple! Let’s create our own installer. We will create the private instance of installer inside the actual service itself and pass it as additional installer to basic TransactedInstaller. Also we’ll use calling (the actual running) assembly as the service reference.
/// <summary>Installs the provider service in interactive mode.</summary>
public void Install() {
if (Environment.UserInteractive) {
var ti = new TransactedInstaller();
var spi = new ServiceProviderInstaller();
ti.Installers.Add(spi);
var path = "/assemblypath=" + Assembly.GetEntryAssembly().Location;
var ctx = new InstallContext("", new string[] { path });
ti.Context = ctx;
ti.Install(new Hashtable());
}
}
The same way we’ll do uninstaller
/// <summary>Uninstalls the provider service in interactive mode.</summary>
public void Uninstall() {
if (Environment.UserInteractive) {
var ti = new TransactedInstaller();
var spi = new ServiceProviderInstaller();
ti.Installers.Add(spi);
var path = "/assemblypath=" + Assembly.GetEntryAssembly().Location;
var ctx = new InstallContext("", new string[] { path });
ti.Context = ctx;
ti.Uninstall(null);
}
}
We almost done, the only problem is Component Designer which wants to be run when you click on any class derived from ServiceBase. I know that Visual Studio developers wanted to do our life easier, but this designer (especially one cannot initialize abstract classes) is very annoying. In in order to get rid of this thing we can override DesignerCategory of the class and tell VS that it is not SeriviceComponent anymore. To do this all we need is one small attribute set on classes
[System.ComponentModel.DesignerCategory("")]
public abstract class ServiceProvider : ServiceBase {
…[RunInstaller(true), System.ComponentModel.DesignerCategory(""), SerializableAttribute]
public class ServiceProviderInstaller : Installer {
Take into account that it should be full reference pass in order to help Visual Studio with fast resolving of references.
We done, let’s put everything together and see what we have and how to use it
/// <summary>Provides service class to respond to service control manager (all responses are defaults).</summary>
[System.ComponentModel.DesignerCategory("")]
public abstract class ServiceProvider : ServiceBase {public static string Name;
public static string ProviderKind;public ServiceProvider(string name) {
ProviderKind = name;
Name = "Magic.Provider." + ProviderKind;
ServiceName = Name;
}/// <summary>Starts the provider service in interactive mode.</summary>
public void Start(string[] args) {
if (Environment.UserInteractive) {
OnStart(args);
} else {
ServiceBase.Run(this);
}
}/// <summary>Installs the provider service in interactive mode.</summary>
public void Install() {
if (Environment.UserInteractive) {
var ti = new TransactedInstaller();
var spi = new ServiceProviderInstaller();
ti.Installers.Add(spi);
var path = "/assemblypath=" + Assembly.GetEntryAssembly().Location;
var ctx = new InstallContext("", new string[] { path });
ti.Context = ctx;
ti.Install(new Hashtable());
}
}/// <summary>Uninstalls the provider service in interactive mode.</summary>
public void Uninstall() {
if (Environment.UserInteractive) {
var ti = new TransactedInstaller();
var spi = new ServiceProviderInstaller();
ti.Installers.Add(spi);
var path = "/assemblypath=" + Assembly.GetEntryAssembly().Location;
var ctx = new InstallContext("", new string[] { path });
ti.Context = ctx;
ti.Uninstall(null);
}
}
}[RunInstaller(true), System.ComponentModel.DesignerCategory(""), SerializableAttribute]
public class ServiceProviderInstaller : Installer {
private static readonly string ServiceName = ServiceProvider.Name;
public ServiceProviderInstaller() {
var processInstaller = new ServiceProcessInstaller {
Account = ServiceAccount.LocalSystem
};var serviceInstaller = new ServiceInstaller {
DisplayName = "Magic Service " + ServiceProvider.ProviderKind + " Provider",
Description = "Process the interface to the Magic service " + ServiceProvider.ProviderKind + " provider.",
ServiceName = ServiceName,
StartType = ServiceStartMode.Automatic,
};
this.Installers.Add(processInstaller);
this.Installers.Add(serviceInstaller);
}protected override void OnCommitted(IDictionary savedState) {
base.OnCommitted(savedState);
var c = new ServiceController(ServiceName);
c.Start();
}
}
In order to use it, just reference to the hosting assembly and inherit this class
public abstract class SampleService : ServiceProvider {
/// <summary>Creates a new <see cref="SampleService"/> instance.</summary>
public SampleService()
: base("Sample") {
}
}
And run it from command prompt:
class Program {
static void Main(string[] args) {
var p = new SampleService();
if (args.Length > 0) {
if (args[0] == "/i"){
p.Install();
return;
}
if (args[0] == "/u") {
p.Uninstall();
return;
}
}
p.Start(null);
Console.Read();
p.Stop();
}
}
We done. The only remaining thing is how to prevent component designer appearance on derived (SampleService) class. As for now I found no way to do this and asked collective intelligence to help me with it. Once I’ll have an answer I will update it here.
Be good people and have a good day!
UPD (25th Jan): The reason for this strange behavior is cached reference assemblies. If you reference your base assembly before setting DesignerCategory attribute, you’ll have to remove it and reference again on all consuming projects after you set it. Another evidence of Visual Studio developers laziness.
January 24th, 2012 · Comments (3)
Visual Studio Face-to-Face battle
Yesterday Visual Studio 2010 was released. This is very exciting, however from the moment I played with very first preview versions I had concerns regarding the performance of it code editor. So today I had some time to perform small face-to-face battle between different versions of Visual Studio – 2005, 2008 and 2010 (Sorry, I did not found VS2002 to test).

Environment
I used very slow machine with 256Mb of RAM running Windows XP as a reference for comparison. First of all I installed each one of those programs. I used customized installation to install only C# programming modules.
Then I tested cold start (first application start) and hot start (average of 5 forecoming starts), creation and opening of new console application project. And finally the real world test. Typing in, compilation and run of “Hello World” sample. This includes opening of context menus, tools and options.
I used “Hello World” sample from MSDN for type-in experience. Just for reference, I used small program I wrote to calculate typing speed (this takes into account that most of text is generated by the same macros and shortcuts e.g. “cw”)
Comparison
| VS2005 | VS2008 | VS2010 | |
| Installation | 10 min | 20 min | 40 min |
| Cold start | 1.2 sec | 3.9 sec | 28 sec |
| Hot start | 0.3 sec | 1.3 sec | 4.5 sec |
| Start new project (Ctrl-Shift-N) | 0.2 sec | 3.2 sec | 2 sec |
| Create new Console Application | 16 sec | 3 sec | 24 sec |
| Clear working screen (Ctrl-A + Del) | 0.4 sec | 0.2 sec | 1.2 sec |
| Type in “Hello World” | 41 sec | 56 sec | 1 min 43 sec |
| Average type rate | 93 wpm | 68 wpm | 35 wpm |
| Average UI response (how long it takes to open menu/hint) | 0.7 sec | 1.6 sec | 3.5 sec |
| Installation/Uninstallation disk delta | 40Mb | 60Mb | 2.3Gb* |
| Memory footprint (for this project) | 6Mb | 17Mb | 65Mb |
| Disk space required | 1.4Gb | 2.6Gb | 3.9Gb |
* Can anybody from DevDiv, please, explain me why when I want to install only C# (this is the only checkbox marked during custom installation), you install for me: 
Conclusion
There are some new and pretty eye-candies for VS2010, also support for newer compilers and interpreter. However, my final verdict is “I disappointed”…
I feel a big degradation of productivity between following versions of Visual Studio. In terms of speed, responsiveness and ability to perform everyday developers’ tasks. That’s right, that there are new features, but we should remember that the main purpose of this program is to support writing code.
I hope that MS DevDiv will take this into account and review it understanding of how development environment should be. I, personally, stay with VS2008 without .NET 4.0 (I have my special opinion about this version of .NET, which worse separate post)
If you old enough, you should remember HomeSite. It was beaten by editor named Notepad.exe (or it variants and alternatives) for HTML developers because of it unresponsiveness and unnecessary cumbersomeness of this program. Running after features killed the main purpose – write effective code fast and correct. This how I forecast the future of Visual Studio. Pity me…

P.S. Sorry, I did not write here for a while. This because of a lot of exiting things I did for the last two years. I promise to write more. Frankly! I swear, I will try to!
UPD 14-Apr: For all people have comments about my production environment and a validity of my measurements there, please see how it looks on my work machine (E8400, 8Gb RAM and NVIDIA GeForce 9600 GT)
April 13th, 2010 · Comments (22)
Quick IT tip: How to build bootable USB stick
Because of my main job and lack of human resources there, I invest less and less in community. Thus I lost my MVP title. Sorry, guys. Also a ton of management tasks in big company prevents me from actual coding. However I am still able to find some time for doing “real” things such as Windows Embedded Standard 2011 image building. Thus today I will explain how to build bootable flash USB disk with a couple of simple commands and without using special utilities.
Why to use bootable USB instead of regular CD or DVD ROM? Well, it is more convenience, takes less storage, faster and fully recycle. So let’s start.
1. Insert USB flash drive
2. Run command prompt shell as Administrator (just in case the keyboard shortcut for “Run as Administrator” is Ctrl+Alt+Shift)
3. Type “diskpart” to run Microsoft DiskPart utility.
C:\Windows\system32>diskpart
Microsoft DiskPart version 6.1.7600
Copyright (C) 1999-2008 Microsoft Corporation.
On computer: TAMIRK-DEV
4. List your disks by typing in “list disk” or for those who like it shorter (like me) “list dis”
DISKPART> lis dis
Disk ### Status Size Free Dyn Gpt
——– ————- ——- ——- — —
Disk 0 Online 149 GB 1024 KB
Disk 1 Online 75 GB 2 GB
Disk 2 Online 3814 MB 0 B
Disk 3 No Media 0 B 0 B
Disk 4 No Media 0 B 0 B
Disk 5 Online 14 GB 0 B
5. Identify your flash drive (in my case it is Disk 5)
6. Select this drive to mark it for work by using “select disk 5” or “sel dis 5” command
DISKPART> sel dis 5
Disk 5 is now the selected disk.
7. Clean it (this will delete everything on your disk drive, so be careful) by using “clean” or “cle” command.
DISKPART> cle
DiskPart succeeded in cleaning the disk.
8. Create primary partition – “create partition primary” or “cre par pri”
DISKPART> cre par pri
DiskPart succeeded in creating the specified partition.
9. Select new partition – “select partition 1” or “sel par 1”
DISKPART> sel par 1
Partition 1 is now the selected partition.
10. Mark it as Active partition – “active” or “act”
DISKPART> act
DiskPart marked the current partition as active.
11. Format – “format fs=ntfs quick” or “for fs=ntfs quick”
DISKPART> for fs=ntfs quick
100 percent completed
DiskPart successfully formatted the volume.
12. And finally my favorite command – “assign” or “ass” to mark it ready and create mount point
DISKPART> ass
DiskPart successfully assigned the drive letter or mount point.
13. Exit – “exit” or “exi” to return to command shell
DISKPART> exi
Leaving DiskPart…
Now your thumb drive is ready and bootable. So you can start copying files from ISO image into it.
Other option is to work with volumes rather than with disks. The all difference is in steps 4-6. Instead of “lis dis” use “lis vol” and instead of “sel dis” use “sel vol”. Maybe it is more convenience way of work because in this case you can identify partitions by labels and sizes rather than by sizes only.
DISKPART> lis vol
Volume ### Ltr Label Fs Type Size Status Info
———- — ———– —– ———- ——- ——— ——–
Volume 0 E DVD-ROM 0 B No Media
Volume 1 G DVD-ROM 0 B No Media
Volume 2 System Rese NTFS Partition 100 MB Healthy System
Volume 3 C NTFS Partition 68 GB Healthy Boot
Volume 4 D DATA NTFS Partition 80 GB Healthy
Volume 5 F READYBOOST FAT Removable 3812 MB Healthy
Volume 6 H Removable 0 B No Media
Volume 7 I Removable 0 B No Media
Volume 8 K NTFS Removable 14 GB Healthy
If you already copied your image into disk, you can mark MBR by using special utility called BootSect.exe shipped with WAIK. In our case (with Windows 7 embedded), you’ll have to update master boot code to use BOOTMGR (Vista and up) rather than NTLDR (XP and down)
BOOTSECT.EXE /NT60 K: /mbr
We done, have a good day and be good people. Additional information regarding USB core guys from MS can be archived from their brand new blog (hope it will be up to date).
At the end, just you to know how are CDs make by Discovery Channel
October 7th, 2009 · Comments (4)
TFS licensing model demystification or what should I buy for my company in order not to step on the licensing mine?
Microsoft loves cumbersome licensing models . This is not because of their evil-heartedness, but because it make them possible to get more from bigger companies and less from smaller. However when you come into the real decision about how many and what kind of licenses you have to purchase, you stuck. Today we’ll try to make things clearer, at least for Team Foundation Server and Visual Studio, which is very base things for any software house develops things using Microsoft technologies.
© image for cumbersomeness proposal via Willy-Peter Schaub by SA Architect
To make things even simpler, let’s assume that we do not need TFS Workgroup edition (which is special edition for TFS 5 users only) and we are not using TFS Device CAL (as opposed to User CAL this Client Access License permits one device to be used by any number of users. This kind of CAL is good for kiosks rather then for development environments). Also Test Load Agent needs it own license. So now, and under all those circumstances, let’s start.
To work with TFS we need:
- One or more Team Foundation Server
- More then one Visual Studio Client (editions can vary)
- Optional one or more Software Assurance, which can be licenses separately or together with MSDN subscription
- … and some other optional tools
TFS Licensing
Each instance of TFS needs it license. Even if you have mirrored deployment of TFS, you need a server license for each instance. Also you need separate license if you are using TFS Data Tier on SQL Server cluster or using TFS Proxy. I think it’s clear, that in addition to TFS license you’ll need Windows Server and SQL server licenses (if it used especially for TFS). You can also put Data Tier on existing SQL server in this case you need only another TFS license without SQL.
You do not need additional Team Foundation Server license for the machine used for TF build services. Also this machine does not need another CAL, except one used for the system user used for initialize builds.
To summarize: each instance of TFS need server license in addition to CALs and other server licenses (such as Windows, SQL, SharePoint, IIS etc).
Client Access License
In addition to server license you need also CAL for each used reads and writes to TFS. There are different versions of Visual Studio includes CAL:
- Visual Studio 2008 Team Suite
- Visual Studio 2008 Architecture edition
- Visual Studio 2008 Development edition
- Visual Studio 2008 Test edition
- Visual Studio 2008 Database edition
Visual Studio 2008 Professional does not includes CAL. So each one of contributes needs one of Visual Studios which includes CAL. The TFS clients might be installed on one of those editions and does requires additional license.
You do not need additional license when you are using TFS for only:
- Create work items, bugs, etc.
- Query for work items
- Update work items
Other words product definition, system analysts, managers and “bug fillers” do not required additional CAL. Note, that they will probably need proper Microsoft Office licenses to use Excel or Project to do this, however they can also use TFS web access (browser) or any other 3rd party tool without purchasing separate CAL.
Also you need only one CAL for server software. Other words, if you are using TFS on Windows Server you do not need TFS and Windows Server CAL. Also those CALs covers all earlier versions of all products in use.
To summarize: Each TFS user does not need additional CAL when he has proper license for Visual Studio Team Suite or using TFS for only bug/issues tracking.
Software assurance vs. MSDN
MSDN is more expensive then SA (Software Assurance), however it includes SA and provides some benefits by allowing access to several Microsoft products for development and testing purposes.
There are two different MSDN editions – professional and premium. The difference between those editions (except price) is that Premium editing includes Windows Server Systems and Microsoft Office. Thus with Professional edition you got software assurance for Visual Studio 2008 Professional while with Premium for all other versions.
Let’s simulate the results
For small software house with 10 developers (two architects, 1 DBA and 3 QA), two product definition guys, and manager we’ll need (in addition to OS, other server and Office licenses):
- 1 TFS license
- 2 Visual Studio 2008 Architecture edition
- 1 Visual Studio 2008 Database edition
- 3 Visual Studio 2008 Test edition
- 4 Visual Studio 2008 Development edition
- 1<n<10 MSDN Licenses Premium (as number of employees need it for testing or development purposes)
- 10-n SA licenses (if SA required)
- Additional CAL for build machine
I think, that now it become a bit clearer. For additional information regarding TFS licensing model, please refer Visual Studio Team System 2008 Licensing White Paper or ask your local licensing expert at Microsoft.
August 2nd, 2009 · Comments (20)
“Zone of Pain vs. Zone of Uselessness” or code analysis with NDepend
As for me, there are only two kinds of projects – hobbyist’s nifty tools and systems (scale may wary). The main difference between those is the easiness of making changes and refactoring. Other words, how many other developers I should persuade to do it just because “In the final analysis, it’s their war” – JFK. But what can be the good reason for such fast talk? – “You code sucks or at least it ought to”.

“Every generation needs a new revolution” – Thomas Jefferson
So, in order to win such revolution for “systems” you absolutely need static analysis tools like NDepend. Those tools are not intended for being your advocates, but those intended to help you to understand all risks and approximate the amount of work should be done to fulfill another revolution.
Unfortunately, you cannot use such tools for fair measuring of code quality because of Computer Science rules of thumb. How to decide whether “methods is too big” or “method is too complex”? However you can (and should) use it for dependencies risk detection. For example, in following illustration you can clear understand that any change inside BetterPlace.Core or BetterPlace.Model assemblies (and namespaces) can be painful.
Now the only question is who is responsible of modules, using it and how long will it take to convince them to make a revolution.
From here you can start using CQL (Code Query Language) which is SQL like language invented by Patrick, the author of NDepend, for querying code elements and sections. By using it, you can define what “method is too big” means in terms of your project.
SELECT METHODS WHERE NbLinesOfCode > 300 ORDER BY NbLinesOfCode DESC
Or see where you should replace method overloads by default arguments, introduced in .NET 4.0
SELECT METHODS WHERE NbOverloads > 1 ORDER BY NbOverloads DESC
Then, when you marked all places and human targets for revolution, you can start it. After you done, you can even compare builds and measure the amount of work and quality of results achieved.
To finalize, I just touched the tip of what good static analysis tool can be used for. So get it, learn it and use it not only when you need to make a revolutions, but also during your application design and build process to be aware about how the new monster created will looks like.
Download NDepend >>
Proper disclosure: Apr 15, Patrick, the author of NDepend, asked me to review his tool and offer one license for evaluation. I told him, that do not need to evaluate it because I’m using it for a while (also I had the license of my own) and I’ll be happy to write a review once I’ll have a bit time for it. Now it happened. Thank you, Patrick, for such good work!
July 27th, 2009 · Comments (2)
Some new in-mix downloads
There are some very cool downloads suddenly appear on MSDN download site due to all new technologies, presented at Mix ‘09. So let’s start
- Silverlight 3 SDK beta 1
- If you do not want to install full SDK, you can install only runtime for Windows or Mac. Then, you can read documentation online. You do not need it, if you’re going to install
- Silverlight 3 tools beta 1 for VS2008 SP1. After you have all this, go to the official Silverlight web site and start working.
- If you re “in” .NET RIA Services, you can download March ‘09 preview of it also to use with new Silverlight. It also makes sense to read about what is it in Brad’s blog.
- Also new Silverlight toolkit was released with SL3 support and a bunch of new up/down controls, LayoutTransformer, Accordion and TransitioningContentControl.
- Microsoft Expression Blend 3 Preview. It includes SL3 and WPF3.5 SP1 support, but excludes SketchFlow by now.
To learn more about Silverlight 3.0 and Blend 3.0, you can see first day keynotes at mix 09, Rollup of what’s new in Silverlight 3 by Joe Stegman. This includes offline mode support by Mike Harsh. I’ll write another separate post for this topic, due to the fact, that I’m a desktop guy, so wary about the future of WPF.
To learn more about how to use new Expression Blend, it worth to see this session by Pete Blois. Another good sessions are also wrapped for you by Scott Hanselman.
After we done with all web stuff, let’s speak about a client
- Microsoft MultiPoint SDK. Do you want to use multitouch in your application? This SDK provides you with ability to use up to 250 individual mouse devices simultaneously. And yes, it works with Windows XP SP2 too
- Internet Explorer 8 for Windows XP x32, XP x64, Vista x32, Vista x64
- In case, that you do no have Windows Vista or Windows Server 2008, you can download 30-day evaluation virtual hard disk of Windows Vista or Windows Server 2008 Enterprise and see how it works
. - Also a small present for my old friends (from my military consulting era) – WPF and Silverlight APIs for GIS engine of ESRI. Have a fun!
That’s all by now, going to write a review for new book and will publish it soon (probably even before, you’ll finish with all those downloads and readings). So, stay tuned and be good people.
March 20th, 2009 · Comments (2)
WPF Line-Of-Business labs and Silverlight vs. Flash
Small update today (mostly interesting links)… During my last “Smart Client” session I was asked about WPF LOB application development labs. So, there are two full labs, I noticed about:
Both labs include WPF ribbon and DataGrid, Southridge also come with M-VV-M design sample and some other interesting features. As for me, it seemed, like some parts of those labs can be easily used “as-is” for production level applications, like it was done with SCE starter, which turned into TimesReader (by the way, it has free version again).
For those, who still trying to consider what to use for their next killer app, I propose to read following article from Jordan, which compares between Silverlight and Flash. And then see composite application guidance to use Prism for Silverlight development. Here the video of it usage by Adam Kinney from Channel 9
Have a nice day and be good people
February 18th, 2009 · Comments (6)
Slides and desks from Smart Client Development session
Great thank to everybody attended yesterday at “Smart Client development” session. As promises, please see slides and desks from this session
February 12th, 2009 · Comments (2)
Bootstrapper for .NET framework version detector
You wrote your .NET program, that can be used as stand alone portable application (such as it should be for Smart Client Apps), however you have to be sure, that necessary prerequisites (such as .NET framework) are installed on client’s machine. What to do? How to detect .NET framework version installed on target machine before running .NET application. The answer is – to use unmanaged C++ bootstrapper, that invoke your application if correct version of framework is installed.
Until now there are 15 possible .NET frameworks can be installed on client’s machine. Here the table of possible and official supported versions, as appears in Q318785
| .NET version | Actual version |
| 3.5 SP1 | 3.5.30729.1 |
| 3.5 | 3.5.21022.8 |
| 3.0 SP2 | 3.0.4506.2152 |
| 3.0 SP1 | 3.0.4506.648 |
| 3.0 | 3.0.4506.30 |
| 2.0 SP2 | 2.0.50727.3053 |
| 2.0 SP1 | 2.0.50727.1433 |
| 2.0 | 2.0.50727.42 |
| 1.1 SP1 | 1.1.4322.2032 |
| 1.1 SP1 (in 32 bit version of Windows 2003) | 1.1.4322.2300 |
| 1.1 | 1.1.4322.573 |
| 1.0 SP3 | 1.0.3705.6018 |
| 1.0 SP2 | 1.0.3705.288 |
| 1.0 SP1 | 1.0.3705.209 |
| 1.0 | 1.0.3705.0 |
All of those versions are detectible by queering specific registry keys. However, in some cases, you need to load mscoree.dll and call “GETCOREVERSION” API to determine whether specific version of .NET is installed. You can read more about it in MSDN.
So it’s really simple to write small C++ application (or PowerShell applet), that queries registry and invoke your managed application. How to do this? You can either read about it in outstanding blog of Aaron Stebner, who is Project Manager in XNA platform deployment team or attend my session next week to learn do it yourself. We’ll speak about nifty ways to do it also.
Anyway, by now, you can use small stand alone program, I wrote a while ago, that will tell you all versions of .NET frameworks installed in target machine without any prerequisites. It can be run even from shared network location
See you next week.
PS: Do not forget to download and install the new version of Visual Studio Snippet Designer, which is extremely useful tool by MVP Bill McCarthy, you’ll need it later next week…
Have a nice day and be good people.
February 4th, 2009 · Comments (8)
Making TFS better or what is TITS?
Those days me and my team work very hard toward new version of “The System”. This includes massive refactoring of all solutions, hard work with TFS (which not restricted to only adding files, but also deleting, moving, etc. other words, all stuff, which TFS is not really love). Because of this, we need a bunch of handy tools to make our dreams come true and to decrease unnecessary number of clicks inside Team System Explorer and Visual Studio. You do not really think, that we have no tools to make our everyday job easier. We have. However, we never package and release it. Let me introduce “TITS” – Tools, Invaluable for Team System. This suite I’m planning to release as another open source project within couple of months.
What “TITS” includes? First of all –
“QOF” – Quick Open File
This tools is absolutely invaluable if you have big solutions. While all it knows to do is to search. But, wait, what’s wrong with build-in search of Visual Studio? First of all, it does not search Solution items and files, are in solution directory, but not in project. Also it cannot fix your typos and errors. Also it does not know to move you quickly to found solution item in Solution Explorer or in Source Editor.
Basic set of QOF features:
- No mouse – open any file
- No mouse – locate any file in solution explorer
- Highlighting found items
- Multiple files open
- Filter by source files only, resources, owner or any other kind of filters
- Search inside TFS, including history, changesets, shelves (either private and public)
- …and much much more
Next tool is:
“WIBREW” – Who Is Breaking What
Absolutely invaluable tool to know who actually breaking what file inside TFS. For example, I do not want to lock files, while I still want to know who holds what file. TFS provides such feature out-of-the-box, however from command prompt only. You can add it even as macro. Like this:
However it not user friendly and impossible for use, ‘cos it looks as following:
You do not know what actually developer doing, where and why. With “WIBREW”, you can know:
- When developer started to break files
- What exactly he’s doing
- Is the breaking file locked or now
- Where the developer breaks it (workspace and computer name of the user)
- …and much much more
Another tool is:
“WITCH” – What I have To Check-in
If you ever worked with Team Force, you know what this tool is doing. It shows you a preview of all changed files, you’ll check-in. For some reason, TFS has no such feature. Let’s imagine, that your work method is to check out everything, change something and check-in only changed files. Until here TFS does everything, however if you want to preview changeset (for example in order to compare with “WIBREW” output), you can not. Here “WITCH” comes to help.
[Here should be a screenshot of “WITCH”, but it looks exactly the same as “WIBREW” with shameless blurring]
Another invaluable tool is:
“VOCUS” – VOid CUstom Settings for check in
This tool is absolutely UI-less. It allows developers to work with their own custom settings in Visual Studio, while for check-in and check-out it format all documents, according predefined custom settings (for example indentation). How many times, you tried to merge files, when all the difference is indentation it tab size? Well, this tool solves this problem.
It stores custom settings for each user (BTW, it also makes able for each developer to restore his settings fluently in any computer) and reformat documents on check-in action toward corporate settings, when on check-out toward custom developer’s setting.
“SHMOC” – SHow MOre Code
This is not actually tool, works with TFS. It rather works with your Visual Studio Development Environment. It’s UI-less as well and makes able to hide and restore all docking windows in VS. It makes you able to write in “Dark Room” mode (which is full screen, distraction free environment) and return to Visual Studio within one button press. It can also change VS color scheme, if required.
There are some other tools should be inside this suite, however, I still have no names for them
Also, if you have something interesting, and you want to contribute it to this suite, you’re highly welcome.
PS: This blog is about code, but this post is 6th in row without even one line of code, so I have to fix it as soon as possible. Thus, I’ll example how WIBREW works under the hood. Other words, small example of how to work with TFS API from Visual Studio plugin.
First of all, as in any VS plugin, you need to acquire DTE2 application object:
_applicationObject = (DTE2)application;
_addInInstance = (AddIn)addInInst;
When you have it, you need to detect what TFS server you’re working with and what are user credentials for this session. The common problem of WIBREW for poor men, was how to work with this tool over VPN (when your connected session is only inside VS). So each time, you tried to run it, you had to enter your domain credentials – very inconvenience way of work.
In order to prevent it, let’s ask your environment about Team Foundation information:
private TeamFoundationServerExt _tfsExt;
…
_tfsExt = (TeamFoundationServerExt)_applicationObject.GetObject("Microsoft.VisualStudio.TeamFoundation.TeamFoundationServerExt");
Also, you can be notified when your work project context was changed. To do this, just subscribe to ProjectContextChanged event and handle it inside:
_tfsExt.ProjectContextChanged += OnProjectContextChanged;
…
public void OnProjectContextChanged(object sender, EventArgs e) {
if (!string.IsNullOrEmpty(_tfsExt.ActiveProjectContext.ProjectName)) {
Now when we know, that we have out active project context, all we have to do is to ask about changes
private VersionControlExt _vcExt;
…
_vcExt = (VersionControlExt)_applicationObject.GetObject("Microsoft.VisualStudio.TeamFoundation.VersionControl.VersionControlExt");
Inside VersionControlExt object you have following self-descriptive properties and methods: FindChangeSet, History, PendingChanges, SolutionWorkspace etc. however it works only with TFS solution explorer. To handle pending changes for the project without tickling TFS, we can use it internal methods. All the difference is with references. To work with Visual Studio TFS explorer methods, you should reference:
Microsoft.VisualStudio.TeamFoundation.dll, Microsoft.VisualStudio.TeamFoundation.Client.dll and Microsoft.VisualStudio.TeamFoundation.VersionControl.dll, while working with TFS API directly, use Microsoft.TeamFoundation.dll, Microsoft.TeamFoundation.Client.dll and Microsoft.TeamFoundation.VersionControl.dll from [PROGRAM FILES]\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies\. Just like this:
VersionControlServer _vcs
…
_vcs = (VersionControlServer)_server.GetService(typeof(VersionControlServer));
…
var _sets = _vcs.QueryPendingSets( new[] { new ItemSpec(serverPath, RecursionType.Full) }, null, null);
…
foreach (PendingSet set in sets) {
… //Get everything you need here
We done. It’s very easy to work with Team System from inside Visual Studio. Also it’s very easy to build useful tools, not built by Microsoft for some reason
Have a nice day, be good people and wait for me to beatify sources before releasing as another Open Source application.
January 27th, 2009 · Comments (11)
Discover other tags
My tools
- .NET Framework Detector
- Duplicate images finder
- Exchange Security Policy for Windows Mobile Devices Fix
- Gas Price Windows Vista SideBar gadget
- Israel Traffic Information Windows Vista SideBar gadget
- Localization fix for SAP ES Explorer for Visual Studio
- LocTester
- RTL and LTR in Windows Live Writer
- Silverlight controls library
- Snipping tool integration plugin for WLW
- USB FM receiver library
- Vista Battery Saver
- WebCam control for WPF
- Windows Live SkyDrive attachment for Windows Live Writer
- Wireless Migrator
- WPF Virtual Keyboard



