środa, 16 września 2009

Skype extension for Firefox, czyli problemy... [PL]

Nie wiem jak Wy, moi czytelnicy, ale ja od jakiegoś czasu miałem problemy z moim Firefox'em. W różnych serwisach nie mogłem się zalogować, lub musiałem powtarzać czynność logowania (np. przy wykorzystaniu narzędzi Google, na dotNetoManiaku, na jakichś różnych forach). Pomagało trochę czyszczenie plików tymczasowych przeglądarki, jednak po jakimś czasie problem wracał. W innych przeglądarkach np. w IE, problem nie występował. byłem więc trochę rozżalony faktem, że Firefox się zepsuł.

Jednak dzisiaj napotkałem na posta: "Skype extension for Firefox- zło powodujące problem cachowania strony". I problem się rozwiązał. To nie Firefox był winny a dodatek Skype! Odinstalowałem go, a mój Firefox znów działa jak należy ;).

niedziela, 13 września 2009

Jak wykonać build kodu C# .NET przy pomocy linii poleceń systemu Windows [PL]

Promuj

Zwykle kod kompiluje się i wykonuje build bezpośrednio ze środowiska IDE, czasami jednak zachodzi potrzeba, że chcemy wykonać build poza środowiskiem IDE, np. wykorzystując skrypty linii poleceń systemu Windows. Jak można to zrobić? Są przynajmniej trzy możliwości: kompilator CSC, MSBUILD lub Visual Studio wywołane z linii poleceń.

W tym artykule pokarzę przykładowe wykorzystanie każdej z metod w oparciu o prosty przykład: aplikację typu "Hello World!", o następującym kodzie w pliku Program.cs:

using System;

namespace HelloWorld
{
  class Program
  {
    static void Main( string[] args )
    {
      Console.WriteLine( "Hello World !" );
    }
  }
}

Solution (HelloWorld.sln) natomiast wygląda następująco:

CSC.EXE

Jest to podstawowy kompilator dla C#, czyli Microsoft (R) Visual C# 2008 Compiler. Jego bezpośrednie wykorzystanie jest możliwe aczkolwiek mało wygodne. To właśnie tego kompilatora używają inne narzędzia do kompilacji kodu. Prosty przykład wskazujący jak można wykorzystać to narzędzie do wytworzenia pliku wykonywalnego na podstawie wspomnianego solution wygląda następująco:

"%Windir%\Microsoft.NET\Framework\v3.5\csc"  /out:.\HelloWorld.exe .\HelloWorld\Program.cs

MSBUILD (msbuild.exe)

MSBuild, czyli Microsoft (R) Build Engine jest bardzo wygodnym narzędziem które z wykorzystaniem linii poleceń systemu Windows pozwala na build poszczególnych projektów lub całego solution wytworzonego przy pomocy IDE jakim jest Visual Studio. Wynik działania narzędzia w czytelny sposób prezentowany jest na ekranie konsoli, a dodatkowo dzięki różnym kolorom tekstu można łatwo się zorientować, czy build przeszedł pomyślnie. Prosty przykład wskazujący jak można wykorzystać to narzędzie do wytworzenia pliku wykonywalnego na podstawie wspomnianego solution wygląda następująco:

"%Windir%\Microsoft.NET\Framework\v3.5\msbuild"  .\HelloWorld.sln /t:build /p:Configuration=Release

Niestety narzędzie ma też pewne wady, a mianowicie nie wszystkie typy projektów są wspierane, np. to narzędzie nie nadaje się do zrobienia build’u projektu typu "setup".

Visual Studio z linii poleceń (devenv.exe)

Środowisko Visual Studio można również wywołać z linii poleceń (bez uruchamiania interfejsu graficznego). Tą cechę można wykorzystać właśnie do wykonania build’u, np.:

"%VS90COMNTOOLS%\..\IDE\devenv.exe"  .\HelloWorld.sln /rebuild Release 

Tutaj dużym pozytywem jest fakt , że wpierane są wszystkie typy projektów wspierane przez Visual Studio. Niestety są też wady, a mianowicie dużo trudniej stwierdzić, czy biuld się udał, czy coś poszło nie tak (i dlaczego?) oraz zdarza się (przynajmniej u mnie) że środowisko kończy swoje działanie w wyjątku.

Podsumowując

Na tym prostym przykładzie widać, że mamy kilka możliwości by wykonywać build’a z linii poleceń (np. przy pomocy jakiegoś skryptu). Najwygodniejszym (i polecanym) jest MSBUILD, chociaż w przypadku nie wspieranych przez niego projektów warto wspomagać się wywołaniem Visual Studio (devenv.exe) bezpośrednio z linii poleceń.

Promuj

piątek, 11 września 2009

Problemy z STA i MTA [PL]

Promuj

Czy zauważyliście kiedyś nad startową procedurą aplikacji (main) atrybuty: [STAThread] i [MTAThread]? Od nich zależy w jakim trybie będzie działał wątek główny aplikacji: Single Threaded Apartment, czy Multi Threaded Apartment? Nie chciałbym tutaj wchodzić w teoretyczne szczegóły, ale zobaczcie jaki ciekawy błąd można uzyskać wykorzystując tryb MTA i kontrolkę System.Windows.Forms.WebBrowser:

System.Threading.ThreadStateException was unhandled Message="ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot be instantiated because the current thread is not in a single-threaded apartment."

Jak temu zaradzić? ano trzeba zmienić tryb tego wątku, który wyświetla WebBrowser na STA i wtedy powinno już wszystko działać.

Aby lepiej to objaśnić zaprezentuje kod, który zakłada istnienie funkcji ShowAboutDialog, która wyświetla okienko "About" zawierające kontrolkę WebBrowser:

//About box contains web browser controll that must be run in STA!!
System.Threading.Thread th = new System.Threading.Thread( 
   new System.Threading.ThreadStart( ShowAboutDialog ) );
th.SetApartmentState( System.Threading.ApartmentState.STA );
th.Start();
Promuj

czwartek, 10 września 2009

Jak utworzyć XmlElement? [PL]

Promuj

Czy próbowaliście wytworzyć kiedyś element klasy XmlElement?...mmmhm... przy pomocy konstruktora się nie da, gdyż jest on protected internal. Cóż więc można zrobić?

Odpowiedź jest prosta, trzeba stworzyć XmlDocument, a dopiero przy jego pomocy wytworzyć odpowiedni XmlElement.

Proste, prawda? A jakie intuicyjne...

Kod wykonujący tą czynność znajduje się poniżej:

XmlDocument xmldoc = new XmlDocument();
XmlElement elem = xmldoc.CreateElement( "nazwa_elementu","http://odpowiedni namespace" );
elem.InnerText = "wartość elementu";
return elem; // zwracamy wytworzony element
Promuj

wtorek, 8 września 2009

SC.exe, a kontrola serwisów w Windows [PL]

Promuj

Jakiś czas temu opisywałem jak można przy pomocy platformy .NET utworzyć i zainstalować serwis w systemie Windows. W tamtym przypadku do instalacji bądź deinstalacji serwisów zostały wykorzystane odpowiednie klasy instalacyjne, które wykorzystane są podczas instalacji, bądź deisntalacji całego produktu. Zdarza się jednak, że nie zadziałają one jak należy (np. nie potrafią usunąć serwisu), czasami po prostu nie chcemy uruchamiać instalatora produktu by przetestować nasz serwis lub chcemy jako serwis uruchomić zupełnie inną aplikację (serwis WWW, repozytorium, czy cokolwiek innego).. Czy jest więc możliwość "ręcznego" stworzenia lub usunięcia serwisu?

Okazuje się że TAK.

Można w tym celu wykorzystać narzędzie działające w linii poleceń systemu Windows: sc.exe .

Szczegółowe informacje na temat narzędzia można znaleźć tutaj: http://technet.microsoft.com/en-us/library/cc754599%28WS.10%29.aspx. Jak widać lista opcji jest dość spora. Ja w tym artykule chciałbym się skupić się na sposobie instalacji i usunięcia serwisu w systemie Windows

Instalacja serwisu Windows

W celu instalacji serwisu wykorzystujemy polecenie sc create o następującej składni:

sc [<ServerName>] create [<ServiceName>]
[type= {own | share | kernel | filesys | rec | interact type= {own | share}}] 
[start= {boot | system | auto | demand | disabled}] [error= {normal | severe | critical | ignore}]
[binpath= <BinaryPathName>] [group= <LoadOrderGroup>] 
[tag= {yes | no}] [depend= <dependencies>]
[obj= {<AccountName> | <ObjectName>}] 
[displayname= <DisplayName>] [password= <Password>]

w najczęstszym przypadku będzie to:

sc create MojaNazwaSerwisu binpath="Sciezka_do_pliku_wykonywalnego_serwisu_razem_z_ew_argumentami"

Usuwanie serwisu Windows

W celu usunięcia serwisu wykorzystujemy polecenie sc delete o następującej składni:

sc [<ServerName>] delete [<ServiceName>]

w najczęstszym przypadku będzie to:

sc delete MojaNazwaSerwisu 
Promuj

niedziela, 6 września 2009

Modyfikacja zawartości dokumentów DOCX (Część 1.: Wprowadzenie)[PL]

Promujkick it on DotNetKicks.com(English version)Shout it(English version)

W ramach kontynuacji tematyki związanej z Open XML Format SDK, chciałbym dzisiaj zwrócić uwagę kolejną funkcjonalność tego pakietu SDK, a mianowicie możliwość modyfikacji (edycji, dodawania komentarzy, itp. …) istniejących dokumentów.

W tym przykładzie załóżmy, że chcemy dodać na końcu istniejącego dokumentu docx nowy paragraf (zawierający znany tekst: "Hello World! ").Przykładowa funkcja, która może wytworzyć taki paragraf może wyglądać następująco:

private Paragraph CreateAndReturnHelloWorldParagraph()
{
   //Create paragraph
   Paragraph paragraph = new Paragraph();
   Run run_paragraph = new Run();
   // we want to put that text into the output document
   Text text_paragraph = new Text( "Hello World!" );
   //Append elements appropriately.
   run_paragraph.Append( text_paragraph );
   paragraph.Append( run_paragraph );
   return paragraph;
}

Teraz dodajmy nasz nowy paragraf (z tekstem "Hello World" na końcu istniejącego dokumentu.

Pierwszą czynnością, którą należy zrobić to otworzyć dokument, w tym celu można wykorzystać funkcję: "WordprocessingDocument.Open". Pierwszym argumentem funkcji jest nazwa pliku, natomiast drugi określa tryb dostępu (true jeśli plik ma być otworzony do odczytu I zapisu). Oczywiście ponieważ my będziemy modyfikować plik, dlatego należy ustawić tryb na odczyt i zapis (więc drugi argument powinien być równy "true").

Zauważmy, że użyty dokument powinien być zamknięty (nie może być aktualnie otworzony przez żadną inną aplikację (np. przez edytor Word), w przeciwnym razie otrzymamy wyjątek typu: System.IO.IOException ("The process cannot access the file XXX.docx' because it is being used by another process.").

Kolejną czynnością jaką musimy wykonać jest dodanie nowego paragra fu na końcu "body" modyfikowanego dokumentu (element: myWordprocessingDocument.MainDocumentPart.Document.Body)

Ostatnim krokiem jest zapis zamodyfikowanego dokumentu (mainDocumentPart.Document.Save();)

Proste, prawda?

Ostatecznie otrzymany kodu modyfikujący dokument może wyglądać następująco:

//Selecting a file
OpenFileDialog myopenFileDialog = new OpenFileDialog();
myopenFileDialog.Filter = "Word 2007 file (DOCX)|*.docx";
if ( myopenFileDialog.ShowDialog() == DialogResult.OK )
{
  //Open and manipulate docx
  using ( WordprocessingDocument myDoc = WordprocessingDocument.Open( myopenFileDialog.FileName, true ) )
  {
    //Access main part of document. 
    MainDocumentPart mainDocumentPart = myDoc.MainDocumentPart;
    //Creation of the new "hello world" paragraph
    Paragraph newelloWorldParagraph = CreateAndReturnHelloWorldParagraph();
    //Add new paragraph at the end of document body
    mainDocumentPart.Document.Body.Append( newelloWorldParagraph );
    //save the document
    mainDocumentPart.Document.Save();
  }
}
Promuj kick it on DotNetKicks.com(English version)Shout it(English version)

sobota, 5 września 2009

Modification of the content of the DOCX document (part 1: Getting started) [EN]

kick it on DotNetKicks.comShout it

The Open XML Format SDK supports not only the creation of the new document but allows also the modification of the existing document. In this short article I want to present the short overview of how to do it.

Posty powiązane / Related posts