Thursday, February 22, 2007 10:58 PM
mikaeld
Sexiga saker... Som licensiering av komponenter!
En dag i veckan leker jag "Ask The Expert" hos ett stort företag. Jag sitter på en blå stol och en massa trevliga människor kommer med allsköns frågor kring utveckling på vår plattform. Det sköna är att det ena gången kan vara en hårig ATL-fråga, eller varför IE6 beter sig weird om man kör under en 3G switch och JScript runtime körs i en minnesarea över 2 gig och i nästa sekund en klurig WinDBG fråga om någon intrikat detalj som jag inte sprungit på innan. Högt och lågt, vitt och brett, svårt och lätt… Cool! I tisdags kom det en bra fråga kring licenshantering i .net. När jag fick den frågan kändes det som om jag var med i "Ask the Looser" istället... Har ägnat hur mycket tid som helst för att förkovra mig i WCF, WF och våra andra kärleksfulla teknologier men när det gäller en osexig, lite halvtråkig sak som licensiering så hade jag noll koll... Dåligt...
I COM-världen fanns det från början ingen licenshantering... alls... men med COM2 infördes en kall hantering i form en bunt instuffade metoder under IClassFactory2 som blandannat gjorde att man fick den där schyssta nag-screenen när man ville använda kontroller i MFC, VB eller (på tal om sexig) Visual FoxPro, när man t.ex. försökte använda en kontroll som fick köra runtime, men inte fick köra i designläge...
I detta fall ville kunden använda någon form av licenshantering för att hantera licensiering av WPF kontroller. Det schyssta är att detta är inbyggt i .net framework. Och det funkar för ALLA era klasser... Inte bara WPF och UI stuff... Och är löjligt enkelt att använda... Gör såhär..
Välj ut en klass att licensiera, tagga upp klassen med ett LicenseProvider attribut och skicka in din LicenseProvider, gör en koll i konstruktorn och glöm inte att disposa licensen... Klart!
1: using System;
2: using System.ComponentModel;
3: using LicensedClass;
4:
5: namespace MV.LicenseStuff { 6: [LicenseProvider(typeof (MyCustomLicenseProvider))]
7: public class LicensedClass : IDisposable { 8: private License license;
9:
10: public LicensedClass() { 11: license = LicenseManager.Validate(typeof (LicensedClass), this);
12: Console.WriteLine("This will only be done if the class is licensed dude!"); 13: }
14:
15: public string TheMethodEveryoneWantsToCall() { 16: return "Hey, you have a license dude!";
17: }
18:
19: public void Dispose() { 20: if (license != null) { 21: license.Dispose();
22: license = null;
23: }
24: }
25: }
26: }
Cool! För att implementera en egen LicenseProvider med en kärleksfull licensieringsalgoritm är det bara att ärva från LicFileLicenseProvider och overrida IsKeyValid. Ni vill nog fundera på att skydda licensieringsalgoritmen på nåt schysst sätt, kanske via en Licensing Web Service så att det inte blir en kakbit att reflecta (är detta ett verb?) den.
1: using System;
2: using System.ComponentModel;
3:
4: namespace LicensedClass { 5: public class MyCustomLicenseProvider : LicFileLicenseProvider { 6: protected override bool IsKeyValid(string key, Type type) { 7: if (key != null) { 8: return key.StartsWith("myChilledOutLicenseAlgorithmStuff"); 9: }
10: return false;
11: }
12: }
13: }
Det enda som fattas nu är en licensfil… Det går givetvis att anpassa vart denna laddas ifrån genom att overrida en liten metod i LicenseProviden, ovan köper vi implementationen i basklassen som laddar en LIC fil enligt nedan;
1: string whereToLook = Path.GetDirectoryName(path) + @"\" + type.FullName + ".lic";
2: if (File.Exists(whereToLook)) …
path pekar på GetPathOfAssembly och givetvis bör man dra det hela till nästa nivå om man vill implementera en licenseprovider värd namnet, men detta ger basen för att implementera licenshantering i ALLA era .net klasser, inklusive rockande WPF kontroller… Inte nytt… Inte sexigt… Men vackert!
(Eller enligt posten innan... Bespara er allt detta och bege er till t.ex. till unge herr Appleman på http://www.desaware.com/products/licensingsystem/index.aspx)
Ni kan hitta ett projekt med aktuell kod här:
File Attachment: LicensedClass.zip (21 KB)…
So this is where you are, and this is where I am
So this is where you are, and this is where I've been
Somewhere between unsure and a hundred…