Archive for the ‘.NET’ Category
Posted by jpluimers on 2015/11/25
Code Analysis in Visual Studio objects against using very generic exception types:
CA2201 Do not raise reserved exception types
‘BusinessClass<T>.StopProcessing()’ creates an exception of type ‘ApplicationException’, an exception type that is not sufficiently specific and should never be raised by user code. If this exception instance might be thrown, use a different exception type.
Company.Departement.Functionality BusinessClass.cs 157
Indeed ApplicationException and SystemException are bad (both mapping to also very generic COM HRESULT values COR_E_APPLICATION / -2146232832 / 0x80131600 and COR_E_SYSTEM / -2146233087 / 0x80131501).
Using InvalidOperationException is much nicer in this case. It still maps to a COM exception (in this case COR_E_INVALIDOPERATION / -2146233079 / 0x80131509).
–jeroen
Posted in .NET, .NET 3.0, .NET 3.5, .NET 4.0, .NET 4.5, C#, C# 3.0, C# 4.0, C# 5.0, C# 6 (Roslyn), Development, Software Development | Leave a Comment »
Posted by jpluimers on 2015/11/24
A while ago, I came across a class having (among other members) two methods named like this:
Within one of the other members of the class, I had to (temporarily) Stop processing, then Start it again.
But I couldn’t, as neither Start, nor Stop would make a record of the state it left the instance in.
Always ensure you know the state of an instance.
So I added the state, and tests to ensure a Stop/Start change was indeed not breaking things.
–jeroen
Posted in .NET, .NET 1.x, .NET 2.0, .NET 3.0, .NET 3.5, .NET 4.0, .NET 4.5, C#, C# 1.0, C# 2.0, C# 3.0, C# 4.0, C# 5.0, C# 6 (Roslyn), Delphi, Delphi 10 Seattle, Delphi 2007, Delphi 2009, Delphi 2010, Delphi XE, Delphi XE2, Delphi XE3, Delphi XE4, Delphi XE5, Delphi XE6, Delphi XE7, Delphi XE8, Development, Software Development | 1 Comment »
Posted by jpluimers on 2015/11/18
I missed when the StackExchange App for Android was finally launched, but I totally agree with Paul Lammertsma:
Exceeds expectations This was a long time coming, but it didn’t disappoint. It’s a great aid for a regular on Stack Overflow like me!
–jeroen
via Stack Exchange – Android Apps on Google Play.
Posted in .NET, Delphi, Development, Pingback, Power User, Software Development, Stackoverflow | Leave a Comment »
Posted by jpluimers on 2015/11/17
If you ever need a universal Android ADB driver for Windows, then use this one: koush/UniversalAdbDriver.
I never noticed it was there until Koushik Dutta posted about a signing trick on Google+.
Windows drivers need to be signed, so what he does is generate a self signed certificate on the fly during installation, sign the driver install it, and drop the private key of the certificate.
Each installation has its own key, Microsoft is happy, and it is proven the driver signature mechanism in Windows has a hole.
If you want to do similar things, then this commit is what you are looking for: Use a self signed, self destructing signing cert. · e8b78fe · koush/UniversalAdbDriver.
It isn’t rocket science, but not trivial C# either, so this is a great example of something that works.
–jeroen
Posted in .NET, Android, C#, Development, Mobile Development, Software Development | Leave a Comment »
Posted by jpluimers on 2015/11/11
Really exiting times ahead: Microsoft .Net on Linux.
It’s not fully ready yet, but to get an idea to learn more about running OpenShift Enterprise 3 and a .NET application based on a Red Hat Enterprise Linux container, here are a few links to get started:
I wish that the demo repository at https://github.com/munchee13/snoopalicious.git and the rhosepaas.com domain were accessible (:
There are other alternatives too, but OpenShift (RedHat) and Microsoft working together is really exiting news to me.
If you’re on other distros, here are some more links:
And of course there has been Mono for a while, which is a different implementation of .NET:
Hopefully this will have search results soon: dnvm opensuse tumbleweed.
–jeroen
Posted in *nix, .NET, Development, Linux, OpenShift, openSuSE, Power User, RedHat, Software Development, SuSE Linux, Tumbleweed | Leave a Comment »
Posted by jpluimers on 2015/11/04
From a chat with a co-worker a while ago:
|
I’m not against properties. Just something against properties properties that are objects with writeable fields.
|
So even if you expose such a property as read-only, it can still get its writeable fields overwritten.
That is a pain when those are part of the state of the underlying object.
In other words: encapsulate your state changes.
Here we solved it by making
- the type of the property immutable
- the property writeable
- react on state changes during the write
Proper encapsulation.
In this case it was a project mixing C# and Delphi, but you can easily apply the above to any language featuring classes and properties.
Another solution would have been to extend the type of the property so it can expose an event that fires during change. Much more convoluted.
–jeroen
Posted in .NET, C#, C# 1.0, C# 2.0, C# 3.0, C# 4.0, C# 5.0, C# 6 (Roslyn), Delphi, Delphi 10 Seattle, Delphi 2007, Delphi 2009, Delphi 2010, Delphi XE, Delphi XE2, Delphi XE3, Delphi XE4, Delphi XE5, Delphi XE6, Delphi XE7, Delphi XE8, Development, Software Development | 2 Comments »
Posted by jpluimers on 2015/11/03
Lazy<T> is not constrained to static contexts.
Instance field initialisers cannot use instance references (but can use static references) as they run outside of the constructor.Though there are arguments for instance field initialisers too., I think this is a good reason to initialise fields inside the constructor: there you do have access to instance references (but should not call virtual instance methods or properties) which leads to another reason: consistency as field initialisers run in the opposite hierarchy order as constructors (incidentally causing this virtual method restriction).
Boy, that was a long sentence (:
–jeroen
via:
Posted in .NET, .NET 1.x, .NET 2.0, .NET 3.0, .NET 3.5, .NET 4.0, .NET 4.5, C#, C# 1.0, C# 2.0, C# 3.0, C# 4.0, C# 5.0, C# 6 (Roslyn), Development, Software Development | Leave a Comment »
Posted by jpluimers on 2015/10/27
Today it is about the curse of
ORA-12560: TNS:protocol adapter error
Don’t you love the overly generic error messages you often get, especially from Oracle.
We log the additional information which doesn’t bring much help either:
Errors:Oracle.DataAccess.Client.OracleErrorCollection; Number: 12560
There is so much that can cause the Oracle 12560 error (including spurious SSL things), that it is often like searching for a needle in a haystack.
What in fact happened is that in a few of our .NET config files got empty ConnectionString attributes for Data Source, User Id and Password as this fragment shows:
connectionString=”Data Source=; User Id=; Password=;”
The cause was a parameter substitution step in our build process where we generate each config file based on templates. It failed on some of them as this simple grep query can reveal:
grep -ind connectionstring\=.*\=; *.config
grep -indl connectionstring\=.*\=; *.config
The first one shows the files and lines, the second one only the files.
So we now have some guarding in place that will prevent these attributes to become empty.
–jeroen
Posted in .NET, .NET 4.0, .NET 4.5, C#, C# 3.0, C# 4.0, C# 5.0, C# 6 (Roslyn), Database Development, Development, OracleDB, Software Development | Leave a Comment »
Posted by jpluimers on 2015/10/21
It’s not reproducible yet, so I need to find out why under some rare circumstances, devenv.exe (the Visual Studio IDE) generated build.force files. Sometimes the build then fails, most of the times it succeeds.
Hopefully this has to to with non-project references.
Research links:
–jeroen
Posted in .NET, Development, Software Development, Visual Studio 2013, Visual Studio and tools | Leave a Comment »