Warning: strpos(): needle is not a string or an integer in /customers/a/f/c/fjorden.se/httpd.www/joel/index.php on line 31
Warning: strpos(): needle is not a string or an integer in /customers/a/f/c/fjorden.se/httpd.www/joel/index.php on line 37

Blog by Joel Fjordén a.k.a. Will o Wisp

Blog by Joel Fjordén a.k.a. Will o Wisp

The CSEIgnoreRule Attribute

Wednesday, April 18, 2007, 01:13 PM - Code Style Enforcer

I thought that it could be a good idea to inform you all of the CSEIgnoreRuleAttribute that has been around for some time now. We use it in our project and it is very useful for several reasons.

First of all it clearly documents the reason for violating the code rule, and thus avoids the problem of someone "correcting" it. It also makes the redline disappear from under the rule violation, since the attribute clearly specifies for Code Style Enforcer that it is a deliberate violation.

I will now give you an example of where and when we use it in our project. We demand that all interfaces should be explicitly implemented and for each thus method/property, there should be a matching method/property in the class marked as protected virtual. This makes it possible to override the implementation in derived classes and it also makes it easier and more direct to call local method/properties without the need to first cast yourself to that interface.

But sometimes the protected method/property must be public due to serialization or data binding and when we make it public it violates the explicit interface implementation rule. Therefore it is very nice to be able to clearly specify that we want/need to violate this rule, but it is deliberate, and we can specify why we did so.

In order to use the attribute you must add a reference to the CodeStyleEnforcer.Attributes assembly, which can be found in the normal Visual Studio reference list. Then simply add the CSEIngnoreRule attribute to the member that violates a rule and specify the rule type it is deliberately violating, i.e. Name, Visibility or Implementation. Make sure to also specify a reason for violating the rule.

Another very nice thing with the CSEIgnoreRule attribute is that it only exists in design time in Visual Studio. It never gets compiled into code and thus does not exist in the production code.

I have received some very nice feedback from developers using the latest beta version of CSE. Therefore the next most prioritized features to be implemented are:

• An easier and more user friendly way to choose between local or global, i.e. shared, rules for a solution.

• Name rules and perhaps also visibility rules must be more flexible, e.g. be able to have different name rules depending on the visibility of a language element. I hope I can make it flexible enough without the need for regular expressions, since I abandoned that path in order to add the auto correction feature.

• Hungarian notation is also something that would be nice to support again, without regular expressions.

If you have any more comments or suggestions, please let me know.

Now you have heard my thoughts about the next version, but of course this can all change, we are living in an agile world after all!

I have now updated Code Style Enforcer, after receiving a bug report, that caused problems with selection in the code editor after invoking the context menu for rule violations.

I also added activation/deactivation of Code Style Enforcer to the context menu of the Visual Studio solution.

An uninstall of any previous versions has to be made from the Add/Remove Programs dialog, before installing the new beta version. Why? Well, it has to do with Custom Actions and Upgrade Installations, read my previous blog post for more thorough information.

I ran into this problem when making an upgrade installation of Code Style Enforcer. The problem is that Code Style Enforcer uses custom install/uninstall actions in order to locate and ensure that the correct DXCore version is installed, among other things.

When doing an upgrade installation, the old custom actions assembly is first loaded, into the AppDomain, in order to call the uninstall method for the version currently installed. When it’s time for the Install method to be called in the new Custom Actions assembly, it still uses the old assembly since that is already loaded into the AppDomain. This has to do with how the Assembly.LoadFrom method works. This is really bad, not only since the new and perhaps updated Install method won’t be called, but since the old one will execute instead.

Microsoft suggests signing the Custom Actions assembly with a strong name in order to solve the problem, but I’ve tried that without any success. Another solution might be giving the assembly different names for each new installer version, but this seems like a really ugly solution to me.

I’m really not sure if this problem is entirely bound to setup projects in Visual Studio and the Uninstall and Install/Commit custom actions implemented as part of an Installer class. I will try to migrate my setup project to WiX instead and see if I can get it work as expected.

For the interested, the Windows Installer XML (WiX) is a toolset that builds Windows installation packages from XML source code. I will tell you more about it in another blog post.