The Wiert Corner – irregular stream of stuff

Jeroen W. Pluimers on .NET, C#, Delphi, databases, and personal interests

  • My badges

  • Twitter Updates

  • My Flickr Stream

  • Pages

  • All categories

  • Enter your email address to subscribe to this blog and receive notifications of new posts by email.

    Join 1,861 other subscribers

Archive for the ‘C# 6 (Roslyn)’ Category

anoymyous type trick: Check if KeyValuePair exists with LINQ’s FirstOrDefault – via Stack Overflow

Posted by jpluimers on 2015/08/27

When you have a Dictionary<TKey, TValue>, then LINQ results will get you a enumerables of KeyValuePair<TKey, TValue>.

Since KeyValuePair is a struct, selecting FirstOrDefault will not get you a null, but a default(KeyValuePair<TKey, TValue>) which is a lot harder to handle than null.

Sometimes, being able to get a null out of FirstOrDefault is very useful, so a bit thank you to Marc Gravell for answering this very neat trick:

If you just care about existence, you could use ContainsValue(0) or Any(p => p.Value == 0) instead? Searching by value is unusual for a Dictionary<,>; if you were searching by key, you could use TryGetValue.

One other approach:

       var record = data.Where(p => p.Value == 1)
            .Select(p => new { Key = p.Key, Value = p.Value })
            .FirstOrDefault();

This returns a class – so will be null if not found.

The trick is this portion:

p => new { Key = p.Key, Value = p.Value }

It introduces an anonymous type with two fields: Key and Value. (Note you can introduce any anonymous type here). Since these are classes, FirstOrDefault will return null if nothing was found.

–jeroen

via:

Posted in .NET, .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 »

.NET enable and disable Fusion log to investigate assembly loading issues

Posted by jpluimers on 2015/08/18

Had to investigate some Assembly Loading issues, so I wrote two batch files to enable and disable the .NET Fusion Log:


reg add "HKLM\Software\Microsoft\Fusion" /v EnableLog /t REG_DWORD /d 0 /f


reg add "HKLM\Software\Microsoft\Fusion" /v EnableLog /t REG_DWORD /d 1 /f

They modify the HKLM\Software\Microsoft\Fusion key REG_DWORD value EnableLog.

A few notes:

  • It is very important to turn of the Fusion log settings as soon as you are finished investigating. Fusion logs potentially take a lot of resources.
  • When you have a .NET host like ISS, you have to restart that host (for instance by running iisreset)
  • There is also Fuslogvw.exe Assembly Binding Log Viewer, but I like logging over viewing as logs are persistent.
  • There are more values under HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion you can configure; see the answer by Gary Kindel on StackOverflow:
    • DWORD ForceLog set value to 1
    • DWORD LogFailures set value to 1
    • DWORD LogResourceBinds set value to 1
    • String LogPath set value to folder for logs e.g. C:\FusionLog\ (ensure the final backslash is there and the folder exists).

–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 »

Fuzzing in addition to Unit Tests – via: David Millington G+

Posted by jpluimers on 2015/08/11

I need to give this link from Jonathan Lange which was shared by David Millington some thought:

Embedded in Academia : How to Fuzz an ADT Implementation.

There they add fuzzers to help testing an ADT: in this case an Abstract Data Type in the form of  a red-black tree.

And then see if it can be added to DUnit and NUnit or MSTest/VSTest in some way.

In the original post by Jonathan Lange, an important remark was made by Eric Castelijn:

… the downside being that having non deterministic tests means having test failures that are hard to repeat

When fuzzing multiple or composite values, the chances that you will hit interesting edge cases semi-reliably will drop dramatically, in my experience

–jeroen

via “This post has two points. First, you should write ADT fuzzers. It is often….

Posted in .NET, .NET 2.0, .NET 3.0, .NET 3.5, .NET 4.0, .NET 4.5, C#, C# 2.0, C# 3.0, C# 4.0, C# 5.0, C# 6 (Roslyn), Delphi, 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 »

Difference Between Int32.Parse, Convert.ToInt32, and Int32.TryParse – CodeProject

Posted by jpluimers on 2015/08/05

Every C#/VB/.NET developer should read Difference Between Int32.Parse, Convert.ToInt32, and Int32.TryParse – CodeProject.

Then also read TryParse with default values.

It is all about handling values that are not Integers, Overflow values and Nulls. There are subtle differences, in the handling of the methods, and the exceptions they could throw: ArgumentNullException, FormatException and OverflowException.

Finally read all about the NumberStyles enumeration, IFormatProvider interface and CultureInfo (especially the difference between InvariantCulture, CurrentCulture, CurrentUICulture and InstalledUICulture).

Because getting your conversions right matters.

–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), Development, Mono, Mono for Android, Prism, RemObjects C#, Software Development, VB.NET, VB.NET 10.0, VB.NET 11.0, VB.NET 7.0, VB.NET 7.1, VB.NET 8.0, VB.NET 9.0 | Leave a Comment »

Example of xsd2code only handling xsd annotations for attributes, not for elements, types and other places where they can be used in an XSD.

Posted by jpluimers on 2015/07/22

See the gist below:

Example of xsd2code only handling xsd annotations for attributes, not for elements, types and other places where they can be used in an XSD.

Steps to reproduce:

  1. Install xsd2code and Visual Studio.
  2. Put all these files in one directory.
  3. Run `generate-C#-from-XSD-annotations.bat`.
  4. Diff `annotations.xsd.exe.cs` and `annotations.xsd2code.exe.cs`.
  5. Observe only 1 spot in `annotations.xsd2code.exe.cs` has the annotations converted to C# comments.

Gist: Example of xsd2code only handling xsd annotations for attributes, not for elements, types and other places where they can be used in an XSD. Steps to reproduce.

Read the rest of this entry »

Posted in .NET, .NET 2.0, .NET 3.0, .NET 3.5, .NET 4.0, .NET 4.5, C#, C# 2.0, C# 3.0, C# 4.0, C# 5.0, C# 6 (Roslyn), Development, Software Development, XML, XML/XSD, XSD | Leave a Comment »

Boolean parameters usualy are a sign of weakness (via: Avoiding Booleans)

Posted by jpluimers on 2015/07/16

During a recent code review, I bumped into a couple of C# constructors having boolean parameters, leading to the dreaded magic booleans code smell.

This reminded me of the infamous Avoiding Booleans post on Coding Horror, which now is almost 10 years old.

To celebrate, I will coin the Dutch phrase when marking these in a review:

Boolean parameters en literals zijn vrijwel altijd een zwaktebod. Een teken dat beter nagedacht moet worden over het doel van de code.

The Dutch word zwaktebod is used when bidding Bridge using the Acol system. It is the equivalent of a “weak takeout” response to a bid of 1 NT (notrump or no trump, in other languages sometimes sans atout).

The English translation is just about this:

Boolean parameters and literals virtually always are a sign of weakness. It indicates you need to give more thought to the goal of the code.

–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), Development, Software Development | Leave a Comment »

Performance Considerations of Class Design and General Coding in .NET – CodeProject

Posted by jpluimers on 2015/06/25

The Performance Considerations of Class Design and General Coding in .NET – CodeProject article is a big peek into the content of the book Writing High-Performance .NET Code | Get the best performance out of your .NET code.

Both are highly recommended.

–jeroen

Posted in .NET, 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 »

Aspect Oriented Programming in Delphi

Posted by jpluimers on 2015/06/24

I’ve been doing Aspect Oriented Programming (AOP) in .NET for a long while, mostly using PostSharp LAOS as that was the first AOP .NET library I encountered (5 years ago it became PostSharp 2.0, now it is already at its 10th anniversary!).

AOP allows you to perform separate of concerns (SoC) in your application, especially in the area of cross-cutting concerns like for instance logging, authorization, monitoring, etc.

It took a while in Delphi to allow for AOP, but the TVirtualMethodInterceptor (that introduced in Delphi 2010) can be used to do AOP (only for Virtual Methods, which is still way better than having no AOP at all).

The code requires a lot of manual labor. so I was glad that DSharp (a great library by Stefan Glienke – one of the leading Spring4D contributors) contains a nice wrapper around TVirtualMethodInterceptor so you can use AOP in an attribute based fashion.

Nick Hodges recorded a good introductory video on AOP in Delphi with slides and demo code:

Note that besides DSharp, also MeAOP and Infra provided support for AOP in Delphi, but these haven’t had updates since 2010.

Read the rest of this entry »

Posted in .NET, .NET 2.0, .NET 3.0, .NET 3.5, .NET 4.0, .NET 4.5, C#, C# 2.0, C# 3.0, C# 4.0, C# 5.0, C# 6 (Roslyn), Delphi, Delphi 2010, Delphi XE, Delphi XE2, Delphi XE3, Delphi XE4, Delphi XE5, Delphi XE6, Delphi XE7, Development, Software Development | Leave a Comment »

Inversion of Control via constructor argument passing

Posted by jpluimers on 2015/06/18

Inversion of Control example video on YouTube: business class is not in control of the DAL.

It uses C#, but the code is so simple that every programmer should be able to get it.

Uses:

  • interfaces
  • parameter passing through constructor
  • moving control decisions out of the business class

Inversion of Control (IoC) can later be amended by Dependency Injection (DI), but IoC can easily without that be used very effectively without DI.

I wish the What is…? series had more than 1 episode, but Christian Richards does have some interesting series about game development.

–jeroen

via: duidelijk voorbeeld.

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, RemObjects C#, Software Development, VB.NET, VB.NET 10.0, VB.NET 11.0, VB.NET 7.0, VB.NET 7.1, VB.NET 8.0, VB.NET 9.0 | Leave a Comment »

Batch file: Finds the location of xsd.exe by running the vsvars32.bat of the youngest installed Visual Studio

Posted by jpluimers on 2015/05/12

Boy, Microsoft made it hard to find the location of xsd.exe!

It is actually located like here:

C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\xsd.exe

But that is nowhere on the default path, nor in the registry.

What happens during installation of Visual Studio and/or the Microsoft SDK, is that the vsvars32.bat file of Visual Studio is updated so it can add the location of many tools (including xsd.exe) to the PATH.

So the trick is to find the youngest Visual Studio first, then run the according vsvars32.bat, and then xsd.exe is on the path.


:: Dynamically finds the installed xsd.exe, then calls it with the passed parameters
:: test these environment variables that have 110 or 120 in them (future enhancements: support more Visual Studio versions):
:: Visual Studio .NET 2002: VS70COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio .NET\Common7\Tools\
:: Visual Studio .NET 2003: VS71COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio .NET 2003\Common7\Tools\
:: Visual Studio 2005: VS80COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 8\Common7\Tools\
:: Visual Studio 2008: VS90COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\
:: Visual Studio 2010: VS100COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools\
:: Visual Studio 2012: VS110COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\
:: Visual Studio 2013: VS120COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\
:: They contain `vsvars32.bat` which will update the `PATH` so it includes where `xsd.exe` resides
setlocal enabledelayedexpansion
:: delayed expansion allows for the exclamation marks
:: see http://ss64.com/nt/delayedexpansion.html
:: see http://stackoverflow.com/questions/22857407/windows-batch-how-to-assign-variable-with-dynamic-name
for %%v in (70 71 80 90 100 110 120 130) do if not [!VS%%vCOMNTOOLS!]==[] set VSCOMNTOOLS=!VS%%vCOMNTOOLS!
call :do call "!VSCOMNTOOLS!vsvars32.bat"
call :do where xsd.exe
xsd.exe %*
endlocal
goto :eof
:do
echo %*
%*
goto :eof

view raw

Run-Xsd.exe.bat

hosted with ❤ by GitHub

–jeroen

via:

Read the rest of this entry »

Posted in .NET, .NET 2.0, .NET 3.0, .NET 3.5, .NET 4.0, .NET 4.5, C#, C# 2.0, C# 3.0, C# 4.0, C# 5.0, C# 6 (Roslyn), Development, Software Development, Visual Studio 11, Visual Studio 2010, Visual Studio 2013, Visual Studio 2014, Visual Studio and tools, XML/XSD, XSD | 1 Comment »