FlagAttribute w Enum

Sprawa Flagi w Enum była mi od dawna znana i używałem tego chętnie. Nie wiedziałem jednak, że oprócz operacji logicznego OR’a można zrobić również XOR’a (wykluczenie).

// Remove a flag using bitwise XOR.
meetingDays = meetingDays ^ Days.Tuesday;

Nie wiedziałem też, że tak dobrze jest obsługiwana funkcja ToString():

Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Thursday, Friday

Program requestujący o admin rights podczas startu

Źródło, a od siebie dodam, że z właściwości Projektu wybieramy zakładkę Application i w Resource file wybieramy ścieżkę do utworzonego pliku *.res. Tak skompilowany programy zapyta o hasło admin na początku i będzię mógł robić dodatkowe rzeczy takie jak pisanie do „Program Files”. Nie powinno się w ten sposób z tego korzystać, ale czasem się przydaje (dodawanie manifest file do assembly).
Plik UacManifest:

#include <winuser.h>
#define IDR_MANIFEST 1 // 2 for a DLL

IDR_MANIFEST RT_MANIFEST MOVEABLE PURE
{
    "<assembly xmlns=""urn:schemas-microsoft-com:asm.v1"" manifestVersion=""1.0"">
       <asmv3:trustInfo xmlns:asmv3=""urn:schemas-microsoft-com:asm.v3"">
         <asmv3:security>
           <asmv3:requestedPrivileges>
             <asmv3:requestedExecutionLevel
               level=""highestAvailable"" />
           </asmv3:requestedPrivileges>
         </asmv3:security>
       </asmv3:trustInfo>
     </assembly>"
}

EDIT:
Prościej od razu dodać plik *.res UacManifest.res. Użyteczne np w installatorze windows serwice’ów.

Interlocked Class

Stanąłem dziś przed następującym problemem. Wewnątrz klasy incrementuję, zeruję liczniki. Z zewnątrz natomiast czytam właściwość ProgressValue które oblicza wartość na podstawie liczników. Chodzi tutaj o postęp ProgressBar’a danej operacji. Jest to przykład gdzie można użyć class’y Interlocked. Oczywiście możemy też synchronizować za pomocą lock’ów, powoduje to jednak duży narzut zbędnego kodu jak i późniejszego wykonywania.
Deklaracja licznika

private int _counterA;

Operacja

_counterA++;

dzieli sie na 3 kroki (zgodnie z MSDN):

  1. Load a value from an instance variable into a register.
  2. Increment or decrement the value.
  3. Store the value in the instance variable.

Jeśli więc nasza operacja odczytu wstrzeli się w środek to dostaniemy nieaktualne dane. Sama operacja odczytu danych 32 bitowych jest już atomiczna i nie musimy korzystać z klasy Interlocked. Jest to zresztą powód dla którego brak funkcji Read(ref int32). Jest za to funkcja Read(ref long), której powinniśmy używać na maszynach 32 bitowych gdyż wtedy ta operacja nie jest atomiczna.

        public int ProgressValue
        {
            get
            {
                return _counterA; // * ... (some operations);
            }
        }

Oczywiście przykład jest przejaskrawiony i w tym przypadku nic by się nie stało gdyby korzystać ze zwykłej incrementacji (cała operacja wykonuje się w jednym wątku). Jeśli jednak operacja byłaby wielowątkowa wtedy Interlocked.Increment() zdecydowanie się przydaje.

WIX (Windows Installer XML)

Tytułowe narzędzie jest lepsze od np standardowego Windows Installera gdy trzeba bardziej się dobrać do konfiguracji. Będzię potrzebne częste patchowanie.
Pierwsze dwa tutoriale z Codeproject
Nie kompilowało się więc dodałem wpis „ICE08;ICE09;ICE32;ICE61” do pola Project->Properties->Tool Settings->Supress specific ICE validation. Działa dobrze bez tego.
Najistotniejsze informacje to jak ustawić bitmape oraz tekst licencji:
WixUIDialogBmp=bigback.bmp
WixUILicenseRtf=GPL3.rtf
Najciekawsze artykuły o Upgrades and modularization
Niemiłym problemem jest:

For some strange reason, small updates and minor upgrades cannot be run simply by clicking on the .msi file—they give the error: „Another version of this product is already installed.” We know, stupid… Anyway, you have to start it with the command:

msiexec /i SampleUpgrade.msi REINSTALL=ALL REINSTALLMODE=vomus
Don’t ask me how this would fare with the average user… You’d better start it from an Autorun.inf file or devise an outer Setup.exe shell to launch it.

Gra nad którą obecnię pracuję ma kilkanaście tysięcy plików w różnych katalogach. Dla każdego katalogu musi być osobny Component a co za tym idzie i GUID. Nie można tego obejść ponieważ właśnie tak to ma być robione.

SQLite (dla NHibernate)

Podczas nauki Fluent NHibernate (i pewnie nie tylko) podczas pisania Unit testów przydaje się lekka wersja bazy danych (właśnie SQLite).

Przydatne dwa linki:

  • SQLite ADO.Net provider http://sqlite.phxsoftware.com – Podczas instalacji zaznaczyć aby nie rejestrować tych bibliotek DLL.
    Dlaczego? Po prostu lepiej włączyć je do projektu i zaznaczyć „Copy always”. Nie zgubimy ich gdy przeniesiemy program na inną maszynę.
  • SQLite Administrator http://sqliteadmin.orbmu2k.de – do edytowania rekordów w pliku z bazą

Najciekawsze artykuły do nauki

Poniższe artykuły skłoniły mnie do pisania sobie Bloga, do obserwowania najlepszych polskich blogerów, subscrybowania RSS polskich i zagranicznych serwisów i pewnie jeszcze kilku rzeczy.

jak-szukac-informacji-jak-zadawac-pytania

Jak uczyć się C#?

Jak uczyć się C#, programować i innych takich?

Wszystkie z bloga http://maciej-progtech.blogspot.com/

Jeszcze nie wykonałem zadania domowego do końca…