We’ve started to use SmartAssembly to obfuscate the code for some of the SharePoint products that we’ve been working on, and I’d had a few problems with it. Continue reading “Adding SmartAssembly obfuscation to a Visual Studio Project”
.NET
Random things I learnt doing a code review
Code Reviews are interesting – both sides can learn something, and the one I’ve just done taught me a few things… Continue reading “Random things I learnt doing a code review”
Converting Enumerations
I love Enums – but I always have to look up how to convert them to one thing or another – so a reminder for myself:
Here’s my enumeration:
public enum MyEnum { Alpha, Beta, Gamma }
And the conversions (each enumeration item has a value (e.g. 1) and a string (e.g. “Beta”):
MyEnum someEnum = MyEnum.Beta; //Convert to String string someEnumString = someEnum.ToString(); //Convert to MyEnum again MyEnum someEnum2 = (MyEnum)Enum.Parse(typeof(MyEnum), someEnumString); //Convert to int value int someEnumInt = (int)someEnum; //Convert int to My Enum again MyEnum someEnum3 = (MyEnum)someEnumInt;
C# Code to send an email
I’ve been doing some testing of email enabled lists, and I needed to send quite a lot of emails, so I wrote a little console app to do it. Here’s the core of the code I used, in case I need it again, or it’s useful to someone. It uses System.Net.Mail:
SmtpClient smtp = new SmtpClient(@"vm-moss2007.virtual.local"); for (int i = 1; i <= 100; i++) { MailMessage message = new MailMessage("administrator@virtual.local", <a href="mailto:testlist@sharepoint.virtual.local">testlist@sharepoint.virtual.local</a>); message.Subject = string.Format("Message {0}", i); message.Body = string.Format("This is message '{0}'", i); Console.WriteLine("Sending {0}", i); smtp.Send(message); }
Notes on the Microsoft.SharePoint.WebControls.DateTimeControl
It’s quite nice that this control is available to use in my own pages/web parts, but there are issues:
- As Sven De Bont noticed, it ignores regional settings for the SPWeb it is within. Set the Locale in code yourself based on the current SPContext.
- If it’s left blank, it still returns a selected date – today! You have to check the DateTimeControl.isDateEmpty property first, and if it is false then you can use the DateTimeControl.SelectedDate property.
- It has it’s own validation, and doesn’t play nicely with standard ASP.NET validators – but can be made to do so.
Here we have in microcosm my problems with Microsoft and date/times – an assumption of the local region, and date time controls that would never be empty, right? I had exactly these same problems when writing an Outlook 2003 to SharePoint 2007 integration too. Makes me a bit annoyed! Especially as we have nullable types! Quit screwing around with DateTimes being structs, make them objects and just return me a bloody null if nothing has been selected!
ASP.NET CustomErrors can't capture HTTP 401s…
It’s been a mad few weeks, so sorry for the posts tailing off a bit. Anyway, let’s get back into it with an interesting (and fairly short) problem.
ASP.NET applications can have custom error pages for the different HTTP responses. For example, you can have a custom “404 – Page not found”. Now, this can be a good idea, particularly for errors that produce stack traces or provide potentially sensitive information about the workings of your code. Or, heck, maybe you just want to present a nice looking error page. Continue reading “ASP.NET CustomErrors can't capture HTTP 401s…”
Forms Based Authentication User Management – bah!
SharePoint supports Forms Based Authentication. I suspect this isn’t news to anyone – if nothing else, I’ve posted about articles describing setting it up.
However, what SharePoint doesn’t do is give you a way of administering these users. In those articles about setting it up they all recommend using the Visual Studio ‘Configure Website’ tool. This works, but it isn’t pretty, and I wouldn’t want customers using it!
Now, it is a shame the SharePoint doesn’t have this facility – we’ve got the membership provider framework abstracting the actual storage of user details (SQL database? Active Directory? Flat file? Who cares? It all looks the same through the provider’s interface). Further, the membership provider interface gives you admin functions that you might want – like list, create, delete, update.
Thus, it seems to me that an obvious thing to provide is a user interface for administering the contents of that MembershipProvider. Sadly, it doesn’t. I suppose the problem is that a developer could extend the membership provider interface or something, but it is a pain. I figured that I can’t be the only person suffering this pain, so I decided to check on Codeplex.
(Don’t get me started on the performance of the codeplex site.)
The Community Kit for SharePoint has an FBA management, well, sub-project, I guess. I tried installing it, but soon found myself asking the same question as Wouter Van Vugt – what is the quality of this project? I mean, it installed okay, but I immediately got a NullReferenceException when I tried to use it. Looking into the code, I found some oddities too – like why is the list of users being filtered to those assigned rights to a site? Surely this should just be administered at the site collection level (well, technically, at the web-app level, but they’re usually the same thing)? That just seems an unnecessary complexity. And the Datasource control used for this lacks create, update and delete – so no clever Gridview usage.
There is also another codeplex project – Forms Base Authentication Tools and Utils for SharePoint 2007 – but it’s been in beta for over a year, and has very little activity, so I don’t know what the state of this is.
All of which, ultimately, brings me around to the idea that I’ll have to write my own (though I’m checking to see if Wouter started to do that, as he seems to have come to the same conclusion). And, actually, the crux of it isn’t a SharePoint thing – such a facility would be easy if there was a DataSource control that wrapped the MembershipProvider. I may just write a datasource to do this.
Stupid Visual Studio 2005 MSDN DVD
A note for myself. The MSDN DVD for April 2007 (Disc 3070.1) with Visual Studio 2005 on it can’t be installed directly from the DVD. The installer asks you to ‘Install Disk 1’, which is unfortunate, as there is no disc 1, and the DVD contains both CDs in different directories on it.
The solution is to copy both CDs to a single directory on the hard disc of the machine, and run the installer from there.
Unfortunately, for some reason my virtual machine won’t let me do that directly – it complains about copying one of the files from the DVD – but I can share a folder on the host, and copy the installation files into the VM via that folder.
Once you’ve copied the files on, though, the ‘pre-filled’ licence key isn’t there anymore. You can get the key by starting installing from the DVD, writing it down, and then using it when you install from the hard disc.
It’s crazy the work-arounds you have to go through sometimes 😦
MSI Setup projects in Visual Studio : 2005 != 2008
I’ve been working on a project that is a shared plugin to Office 2003. I was writing this in Visual Studio 2005, but for a variety of reasons (not least of which was having a tidier dev environment), I decided to move this onto a convenient VM which happened to have a lot of the things I needed (MOSS, a domain controller, AD, exchange).
Unfortunately, it also had Visual Studio 2008 too. I didn’t think this would be a problem, though, and so I when I opened the project on it for the first time and it asked me to upgrade the project to 2008, I was happy do. I didn’t think there’d be a problem.
Well, during development, there wasn’t. Whenever I went to test my MSI installer, though, I started to have problems. Installation kept failing and I kept getting the error:
Error 1937. An error occurred during the installation of assembly ‘Extensibility,Version=”7.0.3300.0″,Culture=”neutral”,PublicKeyToken=”B03F5F7F11D50A3A”,ProcessorArchitecture=”MSIL”‘. The signature or catalog could not be verified or is not valid. HRESULT: 0x80131045. assembly interface: IAssemblyCacheItem, function: Commit, component: {8C306A7E-AE8E-14F0-4168-C43060985CF4}
This was surprising. Extensibility.dll isn’t one of mine – it’s a Microsoft one that should’ve been in the Primary Interop Assemblies for Office. Anyway, it’s not one of mine, it hadn’t changed, and it was signed correctly. So what gives? Continue reading “MSI Setup projects in Visual Studio : 2005 != 2008”
Determining if you've got the Outlook 2003 PIAs installed
I’ve just had to write some instructions about how to check if the Office Primary Interop Assemblies are installed – or more specifically, the Outlook ones. I thought that might be useful…
Continue reading “Determining if you've got the Outlook 2003 PIAs installed”