brainbaking/content/wiki/code/csharp/resources.md

4.5 KiB

+++ title = "resources" draft = false tags = [ "", "Users", "jefklak", "Downloads", "pages", "code", "csharp", "resources" ] date = "2015-10-09" +++

C# Resources

In Tests

Zie [code/csharp/testing]({{< relref "wiki/code/csharp/testing.md" >}})

Web config

Zie http://msdn.microsoft.com/en-us/library/dd465326(VS.100).aspx

.NET 4 voorziet een manier om de Web.config file automatisch te transformeren afhankelijk van uw build configuratie (Debug, Release, custom). Je hebt hier 2 files:

  • Web.config (base)
  • Web.[BuildConfigName].config (transformer)

Wat in de tweede file staat, gaat toegepast worden op de eerste file. Je kan dus niet zomaar zaken copypasten en overschrijven, maar moet tags die je wil replacen XDT transformaties op definiëren:

<appSettings>
  <add key######"Bla" value"blie"/>
</appSettings>

met transformer

<appSettings xdt:Transform="Replace">
  <add key######"Bla" value"bloebloe"/>
</appSettings>

Zal de hele appSettings tag vervangen in de base file. Vergeet dat attribuut en er gebeurt niets.

Embedded resources ophalen

        private Stream GetIconAsStream(string icon)
        {
            return Assembly.GetExecutingAssembly()
                           .GetManifestResourceStream(
                               "Full.Namespace.Of.Class.dir.to.image" +
                               icon);
        }

        private void CopyIconsToDir(string dir, params string[] iconNames)
        {
            foreach (var icon in iconNames)
            {
                var downloadStream = GetIconAsStream(icon);
                var tmpFileCreate = File.Create(dir + "<br/><br/>" + icon);
                downloadStream.CopyTo(tmpFileCreate);
                tmpFileCreate.Close();
                downloadStream.Close();
            }
        }

.CSPROJ file inlezen & parsen

Waarom is dit handig? Om bijvoorbeeld te kunnen kijken welke files allemaal included zijn in uw project en met een test alle SQL files verplicht te laten embedden.

(Op die manier staan ze niet als "Content" in de XML structuur). Regex op loslaten of XML parsen.

        private static string ReadProjectFile()
        {
            var dbAssembly = typeof(AbstractUpdater).Assembly;
            * format: 'file:*/C:/Sources/project/UnitTestproject/bin/Debug/project.UnitTest.DLL'
            var projectDir = dbAssembly.CodeBase.Substring(0, dbAssembly.CodeBase.IndexOf(".UnitTest", StringComparison.InvariantCulture));
            var csprojFile = Directory.GetFiles(projectDir.Replace("file:///", ""), "*.csproj")[0];

            var csproj = File.ReadAllText(csprojFile);
            return csproj;
        }

Managed resources disposen

Zie Dispose Pattern @ MSDN; volgende template:

public class DisposableResourceHolder : IDisposable {
 
    private SafeHandle resource; // handle to a resource

    public DisposableResourceHolder(){
        this.resource = ... // allocates the resource
    }

    public void Dispose(){
        Dispose(true);
        GC.SuppressFinalize(this); // tell the GC disposing it isn't needed anymore
    }

    protected virtual void Dispose(bool disposing){
        if (disposing){
            if (resource!= null) resource.Dispose();
        }
    }
}

using()

De .NET CLR vertaalt

using (MyResource myRes = new MyResource())
{
    myRes.DoSomething();
}

naar

{ // limits scope of myRes
    MyResource myRes= new MyResource();
    try
    {
        myRes.DoSomething();
    }
    finally
    {
        // Check for a null resource.
        if (myRes!= null)
            // Call the object's Dispose method.
            ((IDisposable)myRes).Dispose();
    }
}

Moet dan uw object de interface IDisposable implementeren? Harde cast toch?

Java VS C#

Beiden plaatsten objecten in een finalizer queue maar het uitvoeren hiervan is nooit gegarandeerd (crash process, iets anders dat kan gebeuren, ...). IDisposable kan gebruikt worden om managed resources op te kuisen, maar moet manueel aangeroepen worden door clients die dit object gebruiken - hier is ook nog niets van gegarandeerd! Behalve in een using(obj) { } block - hierna wordt Dispose() aangeroepen, ook als er ondertussen een of andere Exception opgetreden is. In Java 6 en lager moet je dit met try { } finally { } manueel doen.

Zie [java resources wiki pagina]({{< relref "wiki/code/java/resources.md" >}})