C# List to Enum flags

This little helper method create a Enum bit field of the requested Type and ignore invalid values and lower/upper case:

 

public static T ListToEnumFlags<T>(List<string> enumFlagsAsList) where T : struct
{
	if (!typeof(T).IsEnum)
		throw new NotSupportedException(typeof(T).Name + " is not an Enum");
	T flags;
	enumFlagsAsList.RemoveAll(c => !Enum.TryParse(c, true, out flags));
	var commaSeparatedFlags = string.Join(",", enumFlagsAsList);
	Enum.TryParse(commaSeparatedFlags, true, out flags);
	return flags;
}

Sample usage:

[Test]
public void ConvertListToEnumFlags()
{
	var stringFlags = new List<string> { "read", "Write", "invalid" };
	var permissions = ListToEnumFlags<Permission>(stringFlags);
	Assert.AreEqual(Permission.Read | Permission.Write, permissions);
}

[Flags]
public enum Permission
{
	Read = 1,
	Write = 2,
	Delete = 4
}

Check if assembly was loaded by NUnit

With this snippet you can check if your test assembly was loaded by the nunit-console (domain name starts with "test-domain-") or by the TeamCity JetBrains.BuildServer.NUnitLauncher (domain name is "NUnit Domain"):

private static bool IsStartedFromNunit()
{
	string currentDomainName = AppDomain.CurrentDomain.FriendlyName;
	return currentDomainName.StartsWith("test-domain-") || currentDomainName == "NUnit Domain";
}

Unable to cast transparent proxy to type 'Roslyn.Utilities.SerializableDataStorage'

Got this strange error today while using Roslyn via NuGet.
To fix it check this:

  1. The is not outdated version of the "Roslyn.Services.dll" process running (check task manager)
  2. The platform target of your DLL or application is "Any CPU"
  3. Visual Studio 2012: Disable "Prefer 32-bit" under the "Platform target" drop-down menu for your startup project.
    This was the reason why it was not working for me.

How to use ClickOnce with proxy authentication

Everyone who worked with ClickOnce to publish his software knows about the big issue that proxy authentication is not supported by Microsoft and you just get a nasty error message like this:

The remote server returned an error: (407) Proxy Authentication Required.

Matt Davis wrote a blog post back in 2009 how developer can bypass this issue when downloading updates.
However, this is only possible after the software was deployed on the target machine, e.g. it is necessary to create a offline setup and set it to the customer.

To solve this issue I created a loader that replace the original "dfsvc.exe" of the .NET Framework and set a custom web proxy like described in the post by Matt Davis and then invokes the internal entry point (named "System.Deployment.Application.DFServiceEntryPoint.Initialize").

The source code is available here on GitHub.
This project has two build configuration, "netfx2-Release" and "netfx4-Release" which will build a .NET 2.0 and 4.0 version of "dfsvc.exe" and copy it inside the "Build" directory of the solution.
Also there is a "ClickOnceProxySettings.xml" file where you have to configure your proxy credentials.

So how do you use this?

  1. Download ClickOnceWithProxySupport_v0.1.zip (8.88 kb)
  2. Extract the "Build" directory
  3. Open "ClickOnceProxySettings.xml" with Notepad and set your credentials
  4. Inside the Windows Explorer, navigate to "%windir%\Microsoft.NET"
  5. Copy the "ClickOnceProxySettings.xml" inside this directory
  6. Depending if you have a 32 or 64 bit installation you have two sub directories: "Framework" and "Framework64" (on x64 only).
    Inside this directories you have a folder "v2.0.50727" and/or "v4.0.30319" (also depend on which framework versions you have installed).
  7. Now you have to copy in each directory the right version of the "dfsvc.exe" from the "Build" directory, just look at the table below:
    Framework\v2.0.50727 Build\netfx2-Release
    Framework\v4.0.30319 Build\netfx4-Release
    Framework64\v2.0.50727 Build\netfx2-Release
    Framework64\v4.0.30319 Build\netfx4-Release
    Make sure that there is currently no instance of "dfsvc.exe" running (check taskmanager)
  8. That's it, you should now be able to run ClickOnce based online installations thought a proxy server with authentication Cool