Monday, January 12, 2009

Using Powershell script to start and stop web services during development

I have been developing some Web Services under VS2008 and Vista 64.

For some reason whenever I tried to test the services under VS2008 I received the message :

Unable to launch the ASP,NET Development Server because port XXXX is in use.

I decided to start and stop the services manually using Powershell and, if debugging was required to used the "Debug->Attach to Process" facility.

Here is the Powershell command to start an instance of the development server on a specified port:

&"C:\Program Files (x86)\Common Files\microsoft shared\DevServer\9.0\WebDev.WebServer.EXE" /port:1420 /path:"C:\Users\User Name\Documents\Code\Services\Status"

Here is the Powershell command to stop all instances of the development server:


&stop-process -name WebDev.WebServer -confirm



Regards

Andy

Sunday, January 11, 2009

ClickOnce - Manually modifying the Application file list.

I am developing a ClickOnce application which requires assemblies and other resources which are not automatically included in the "Application Files".

You can include files in the "Applciation Files" list by adding them to the project. (i.e In VS rightclick on the ClickOnce project and select Add->Existing Item.

The problem with this is that the files are copies into the Project directory.

A better way to handle this is to use an Xml editor to manually edit the project file (*.csproj).

Refer to blogs.msdn.com/mwade/archive/2008/06/29/how-to-publish-files-which-are-not-in-the-project

Regards

Andy

Install Opera Code Signing Certificates into Vista

I recently purchased a "code signing" certificate from Comodo . Comodo charge about half as much as Thawte who are about half of Verisign.
The certificate transfer process is pretty tricky and the certificate ends up installed in the Certificate store of the browser used to request and transfer it.
YOU MUST USE THE SAME BROWSER TO ORDER AND DOWNLOAD THE CERTIFICATE.
I recommend using Opera 9.6 to order and download certificates.
Because I had difficulties with the ordering and download process Comodo issued a replacement certificate. Unfortunately I then used the first certificate for code signing. Comodo had revoked this certificate and the ClickOnce install dialog indicated "Unknown Publish". However, there was NO indication in the Windows Certificate Manager "CertMrg.msc" that the certifcate had been revoked. This issue was only resolved when Comodo support told me the serial number of working certificate.


To install the certificate in Vista proceed as follows:

First export the certificate from the browser ( In this case Opera 9.63 ).


Tools->Preferences->Advanced Tab.
You should see a "Manage Certificates" button.
Press the button.
The browser certificate manager will be displayed. The downloaded code signing certificates should be shown under the "Personal" tab.

Select the certificate and press the "Export" button on the right side of the form.

A file create dialog is displayed. Give the exported certificate a file name and select to save as type "PKCS #12 (*.p12) This type is equivalent to the Windows .pfx type.

Follow the dialogs to export the certificate.


Now install the certificate into the Vista certificate store.

First run the Vista Certificate manage program "certmgr.msc"

Select the Personal/Certificates folder and then Ations->All Tasks->Import

Select the file exported above ( be sure to filter on file type .p12 ).

Follow the import wizard. Be sure NOT to select the

"Enable strong private key protecion" VS Code signing cannot handle the password request

Place the certicate in the "Personal" folder.

The certificate should now be availabe for code signing in VS.

Good luck. Andy

Friday, January 9, 2009

Microsoft StyleCop - Editing setting under Vista 64

Microsoft StyleCopy 4.3 has a master settings file named Settings.StyleCop
This file may be edited with the StyleCopSettingsEditor.exe.
Under Vista 64 write access to the program folders is restricted to users with Administrator privileges.
Here's the rub.
StyleCopSettingsEditor must be running as Administrator to write setting changes to
Settings.StyleCop.
Settings.StyleCop is associated with StyleCopSettingsEditor.exe thru the StyleCop extension, but the "Run as Administrator" option is only available when clicking on exe's.
You can "Run as Administrator" StyleCopSettingsEditor.exe but the exe requires a command line parameter pointing to Settings.StyleCop.

The solution:
Create a shortcut on the desktop to StyleCopSettingsEditor.exe.

Append "Settings.StyleCop" to the target which becomes:

"C:\Program Files (x86)\Microsoft StyleCop 4.3\StyleCopSettingsEditor.exe" "Settings.StyleCop"

Under the Compatibility tab check "Run as Administrator"

Double Click the shortcut to launch StyleCopSettingsEditor.exe. The program is now running as Administrator and has sufficient rights to update Settings.StyleCop in the program folder.

Wednesday, November 12, 2008

Microsoft.mshtml.dll cannot be referenced in VS 2008 3.5 project

I am using VS 2008 and recently upgraded a project from .Net 2.0 to .Net 3.5. (thru the project properties page)
When doing this I checked the Client-only Framework subset option. When I compiled I had errors indicating that the compiler could not reference Microsoft.mshtml.dll.
When I checked the project references this one was marked with the asterisk.

Unchecking Client-only Framework subset option corrected the problem.

Andy

Sunday, September 7, 2008

Testing Enumerations in Eco Ocl

I can never remember the Ocl syntax used to refer to the value of an enumeration.

The syntax is $enumname$::$enumvalue$ 

Here is a sample Ocl string to select a particular value of VehicleTypes 

"VehicleSupplier.allInstances->select( Type = VehicleTypes::MotorHome)"

Monday, August 18, 2008

Using Linq extension methods with arrays

I was generating a file path and file name from user text.

This routine was vulnerable to chars illegal to the file system in the user text.

I needed to strip any illegal chars from the user text.  

The Path class has two static methods which return path and file name illegal chars.

These are:

Path.GetInvalidPathChars( ) -> char[]

Path.GetInvalidFileNameChars( ) -> char[]

In order to strip both I wanted to create the set union of these two arrays.

The Linq set extension methods return IEnumerable which cannot be easily copied to a new array.  

In the end I used the following to generate a set comprising the union of both sets of illegal chars.

List illegals = new List( Path.GetInvalidPathChars( ).Union( Path.GetInvalidFileNameChars( ) ) );

Note that if you wish to change the file extension it is important to add '.' to the list of illegal chars.  Failure to do so may result in your filename being truncated at the '.'.

 

Monday, June 23, 2008

Running wsewsdl3.exe in Vista 64 with VS2008.

Hi,

I ported a VS2005 project from my old XP machine to my new Vista 64 machine running VS2008.

In my project I was using Wsewsdl3.exe to generate c# code from wsdl definitions.

Wsewsdl3 refused to run with the error:

"Could not get the install directory for .NET Framework v2.0 SDK. Please install the .NET Framework v2.0 SDK."

I know that Wsewsdl3 is a pre-processor for Wsdl.exe and also knew that Wsdl.exe had changed paths between VS versions.

Luckily Wsewsdl3.exe is written in .Net and I was able to use Reflector to disassemble the source and find where it was looking for Wsdl.exe.

Here are the code fragments:

Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\.NETFramework");

key.GetValue("sdkInstallRootv2.0")

When I looked in the registry of the old machine I saw this key.

At this point I installed the .Net 2/0 SDK 

http://www.microsoft.com/downloads/details.aspx?FamilyID=fe6f2099-b7b4-4f47-a244-c96d69c35dec&displaylang=en

This installed itself at:

C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0

Now I opened the registry editor RegEdit.exe, moved to HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework and added a new string value with name

"sdkInstallRootv2.0" and value "C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0"

Wsewsdl3.exe now runs.

I hope this has not screwed anything else!

Hope this helps someone.

Andy

Tuesday, April 15, 2008

.Net SDK Tools movedin version 3.0 and 3.5

I have installed VS 2008 and was trying to find the latest version of SDK tooks. (e.g. ResGen.exe etc )

It used to be under:

C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin

But as of Version 3 it has moved to:

C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin

Sunday, April 6, 2008

XPathNavigator and default namespaces

Here is a sample xml document with a default namespace:

<?xml version="1.0" encoding="utf-16"?>
<Invoice xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://informationage.co.nz/schema/invoicing">
<Amount>1906.50</AmountExcGst>
</Invoice>


How do I read the amount node in this xml document.



XmlDocument lXmlDoc = new XmlDocument();
lXmlDoc.LoadXml( soome source for the document above );

// Namespaces
XmlNamespaceManager lNamespaceManager = new XmlNamespaceManager( new NameTable( ) );
// Arbitrary prefix used for default namespace
lNamespaceManager.AddNamespace( "d", "http://informationage.co.nz/schema/invoicing" );

// Navigator
XPathNavigator lNavigator = lXmlDoc.CreateNavigator();
// Note that the default namespace elements must be preifxed with the namespace prefix.
XPathNavigator lNodeNav = lNavigator.SelectSingleNode( "/d:Invoice/d:Amount", lNamespaceManager );



The important thing to note here is that the XPath expression elements MUST be prefixed with the default namespace prefix
added to the namespace manager.

The expression "/Invoice/Amount" will return null.

This one wasted quite a bit of my time so I hope this helps someone else.

Andy

Sunday, February 17, 2008

Problems locating the assembly for Microsoft.Office.Core.DocumentProperties

I am playing around with Word 2007 in Visual Studio 2008.
I was trying to set document properties using code in the form:

( (Microsoft.Office.Core.DocumentProperties) mWordDocument.BuiltInDocumentProperties )[ Word.WdBuiltInProperty.wdPropertyCompany ].Value = "My Company Name";

I had referenced C:\Program Files\Microsoft Visual Studio 9.0\Visual Studio Tools for Office\PIA\Office12\Microsoft.Office.Interop.Word.dll which was available in the GAC but I could not find the assembly which contained the definitions for Microsoft.Office.Core.DocumentProperties.

I found it at C:\Program Files\Microsoft Visual Studio 9.0\Visual Studio Tools for Office\PIA\Office12\Office.dll

Hope this helps another frustrated searcher.

Detecting Office applications and versions

There may be a way to do this in VSTO.  I would have thought so, but I could not find it!  The linked file contains a C# class to detect office applications and versions.

Wednesday, February 6, 2008

Converting Windows local file paths to uri and vice versa

I needed to covert a windows local file path to a uri in order to pass it to a browser control.

e.g.
I wanted to convert a local windows path in the form:
"C:\Documents and Settings\William Tell\My Documents\TestClient"
to the form:
"file:///C:/Documents%20and%20Settings/William%20Tell/My%20Documents/TestClient"

This conversion is supported by the framwork System.Uri class.
Here is some code:

string localPath = @"C:\Documents and Settings\William Tell\My Documents\TestClient";
Uri uri = new Uri( localPath );
string absoluteUri = uri.AbsoluteUri;


The value of absoluteUri is:
"file:///C:/Documents%20and%20Settings/William%20Tell/My%20Documents/TestClient"

Conversely, we can convert the uri back to a local path as follows:


string absoluteUri = @"file:///C:/Documents%20and%20Settings/William%20Tell/My%20Documents/TestClient";
Uri uri = new Uri( absoluteUri );
string localPath = uri.LocalPath;


The value of local path is:
""C:\\Documents and Settings\\William Tell\\My Documents\\TestClient"

Hope somebody finds this helpful.