Using MSBuild Conditional Constructs to run one or other target

I was doing modification of MSBuild target https://github.com/MNF/OctoPack.Precompile/blob/master/Source/OctoPack.Precompile.targets to have different behavior depending on parameter OutDir was specified or not for Msbuild.
Follow to MSDN “MSBuild Conditional Constructs”  I selected  Choose Element and  tried to put it   inside <Target> element
 <Target Name=”foo” />
<Choose>
<When>

<Otherwise>
</Choose>
</Target>
It didn’t work as for Choose Element allowed Parents are only Project, Otherwise, When.
I tried other way to include Target inside Choose/When element, but it is also not allowed, because Target also should be direct child of Project.
I found an implementation in http://stackoverflow.com/questions/30904741/msbuild-now-to-conditionally-use-one-of-two-targets-with-same-name when you set target depends on other targets and each child target has different conditions:
 <Target Name=”foo” DependsOnTargets=”_fooDebug;_fooRelease”/>
    <Target Name=”_fooDebug” Condition=”‘$(Configuration)’ == ‘Debug’ “
Later I found in  http://stackoverflow.com/questions/2284389/how-do-you-stop-msbuild-execution-without-raising-an-error/ that CallTaget elements with condition can be used as well:
 <CallTarget Targets="Exit"
Condition="Special Condition"/>
I beleive that MSDN “MSBuild Conditional Constructs” documentation should provide reference to all such options.

Gmail arbitrary rejects emails with big number of recipients

I was sending information letter to the club subscribers(total 225 emails) using Gmail account. I keep them in 3 mailing lists: 2 with 95 emails and 3rd with remaining(GMail limit recipients to 100 per email). The first list was rejected with the following (not very specific) message.
Delivery to the following recipient failed permanently: email address
Technical details of permanent failure:
Message rejected. See https://support.google.com/mail/answer/69585 for more information.
But the second list with the same size was successful.
Additional annoyance was that “delivery failed” notifications were received slowly within 5 minutes, and initially I didn’t understand which group  (or emails from both groups)  were rejected.
 The simple workaround to split big list in 3 smaller mailing lists one was successful.

TestContext.WriteLine doesn’t accept curly brackets

In test class I was using TestContext.WriteLine trying to output JSON string, I’ve got
System.FormatException : Input string was not in a correct format.
at System.Text.StringBuilder. AppendFormatHelper(IFormatProvider provider, String format, ParamsArray args)
at System.String.FormatHelper(IFormatProvider provider, String format, ParamsArray args)
at System.String.Format(IFormatProvider provider, String format, Object[] args)
at Microsoft.VisualStudio.TestPlatform.MSTestFramework.TestContextImplementation.WriteLine(String format, Object[] args)

Example of code that works for Debug.WriteLine, but not for TestContext.WriteLine is the following:

var msg = “{curly braces}”;
Debug.WriteLine(msg);
TestContext.WriteLine(msg);

I found, that TestContext.WriteLine expects first parameter as a format string, that consider { and } as placeholder delimiters.

UPDATE: Simple workaround,  suggested in a comment by Steve Gilham

TestContext.WriteLine(“{0}”,msg);

I had to write EscapeCurlyBraces extension

public static string EscapeCurlyBraces( this string message)
{
string ret = message.Replace( “{“, “{{” ).Replace(“}”, “}}”);
return ret;
}

and call
TestContext.WriteLine(msg.EscapeCurlyBraces() );
I’ve wrote a suggestion to MS Connect that it will be good to have separate overload TestContext.WriteLine(string msg); that doesn’t consider the parameter as format and doesn’t expect any additional parameters.

The file  https://github.com/MNF/CommonDotNetHelpers/blob/master/src/Strings/StringFormatExtensions.cs and corresponding unit tests https://github.com/MNF/CommonDotNetHelpers/blob/master/Tests/Strings/StringFormatExtensionsTests.cs are located on GitHub.

FromToRange generic class

Quite often you need to return from method 2 values that describe the range, e.g. From/To or Min/Max. You could use standard MS classes Pair or Tuple https://msdn.microsoft.com/en-us/library/system.tuple.aspx. However the names of properties are not describe the meaning of the values.
So I am using own class FromToRange. It is done similar to Pair(from http://blog.o-x-t.com/2007/07/16/generic-pair-net-class/)

///<summary>
/// similar to Pair(from http://blog.o-x-t.com/2007/07/16/generic-pair-net-class/"
///See also  DateTimeRange ( https://github.com/MNF/CommonDotNetHelpers/blob/master/src/Dates/DateTimeRange.cs)
///</summary>

public class FromToRange
{
public T From { get; set; }
public T To { get; set; }

public FromToRange()
{
}

public FromToRange(T from, T to)
{
this.From = from;
this.To = to;
}
public override string ToString()
{
string sRet = String.Format("From {0} to {1}", From, To);
return sRet;
}
public override bool Equals(object obj)
{
if (this == obj) return true;
FromToRange pair = obj as FromToRange;
if (pair == null) return false;
return Equals(From, pair.From) && Equals(To, pair.To);
}

public override int GetHashCode()
{
return (From != null ? From.GetHashCode() : 0) + 29 * (To != null ? To.GetHashCode() : 0);
}

}

Is it possible to determine Visual Studio edition during c# compile time

To use MS Fakes shims, I had to conditionally exclude related tests  to allow easily bypass them on Community and Professional Editions of the Visual Studio.
#if !FAKES_NOT_SUPPORTED
[ TestMethod()]
Fakes related code
#endif
I tried to find does edition automatically pre-defined by compiler, but it’s not included in Conditional Compilation Constants

Furthermore,  these constants seems defined in VB only, and not in c# and not updated since VS2008.

The reasons are discussed in “Pre-defined Constants, preprocessor directives, etc… “

The “C# Language Designers” decided to not include constants in the fashion in which C/C++ allows them.  To allow some, or even one, would open a Pandora’s Box of voices suggesting new constants to be added.

But I disagree,  because if the limitation coming from VS , it should provide a way to  determine it in pre-condition.
The related article shows how to check installed Visual Studio on run-time
Unfortunately I didn’t find, is it possible to determine Visual Studio edition  during c# compile time?

#compile-time, #constants, #visual-studio

Prevent closing PowerShell scripts running from File Explore

For PowerShell scripts to be run from File Explorer it’s important that they not closed automatically.
I am adding to those scripts
if ($host.name -eq ‘ConsoleHost’)
{
  Read-Host -Prompt “Press_Enter_to_continue”
}
Alternately, we can modify the “(Default)” values for our Command keys to include the “-NoExit” parameter.
First I decided,that it is a good idea,and added

 

Set-ItemProperty  HKCR:\Microsoft.PowerShellScript.1\Shell\Command ‘(Default)’  ‘”C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe” “-NoExit” “-ExecutionPolicy” “RemoteSigned” “-file” “%1″‘

 

But then I realized, that  if PowerShell script should be shared with other users, it’s better to explicitly implement pause in a script rather then rely on registry setting on other machines.

Notes about CORS implementation in Web API. 

We’ve created CORS interface using the article
http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api#enable-cors
A few points,t hat I want to highlight:
  1. DisableCors doesn’t stop server to send response, it just sends response without Access-Control-Allow-Origin header.
It’s browser responsibility to check response and generate an error.
It’s important to understand that same-origin policy does not prevent the browser from sending the request. Instead, it prevents the application from seeing the response
  1. When cookies allowed to be shared between sub domains of the same domain, “same origin policy” consider sub domains as different origins.
There is no partial wild cards supported in origins, such as all sub domains *.example.com.
If the server allows the request, it sets the Access-Control-Allow-Origin header. The value of this header either matches the Origin header, or is the wildcard value “*”, meaning that any origin is allowed.
I’ve submitted enhancement suggestion to MS at https://connect.microsoft.com/VisualStudio/feedback/details/2703507/web-api-support-partial-wild-cards-in-cors-origins-field, but it can be done as custom policy implementation as it was answered at http://forums.asp.net/post/6050160.aspx
     3.  Out of the box implementation in attributes use hard coded Origins, with note in documentation:
For example, a custom CORS policy provider could read the settings from a configuration file.
MS should  supply input from configuration out of the box. One of examples provided  in MSDN blog https://blogs.msdn.microsoft.com/webdev/2013/07/02/manage-cors-policy-dynamically/.
Better implementation posted at http://jnye.co/Posts/2032/dynamic-cors-origins-from-appsettings-using-web-api-2-2-cross-origin-support
  1. If you want to share cookies, you need to enable Credentials on both client and server.
Credentials include cookies as well as HTTP authentication schemes. To send credentials with a cross-origin request, the client must set XMLHttpRequest.withCredentials to true.
$.ajax({
    type: 'get',
    url: 'http://www.example.com/api/test',
    xhrFields: {
        withCredentials: true
    }
[EnableCors(origins: “http://myclient.azurewebsites.net”, headers: “*”, methods: “*”, SupportsCredentials = true)]
Further reading: