This post from Report from the battlefield series will be about my own mistake. It is related to async/await and MARS i.e. Multiple Active Result Sets. async/await allows us to use asynchronous programming more easily. MARS is a feature of MSSQL that allows us to have more than one pending request opened per connection at the same time...
Sztuka programowania 2807 dni, 4 godziny, 6 minut temu 46 źrodło rozwiń
I'm working on the project where I have an opportunity to use Roslyn compiler as a service. It is very good :) However yesterday it took me more than 2 hours to write working unit tests (based on MSTest) for my code! Here are some tips that may save your time.
Sztuka programowania 2809 dni, 18 godzin, 41 minut temu 40 źrodło rozwiń
Semantyczny model dostarcza nam wiele informacji o kodzie, które zwykle uzyskuje się po kompilacji. Na przykład przeładowanie metod jest dużo łatwiejsze do określenia już po kompilacji. Oznacza to, że nie jest już to klasyczna, statyczna analiza kodu. Z tego względu, najpierw danych kod należy skompilować za pomocą...
Roslyn to nie tylko parsowanie kodu, ale również zarządzanie projektem\solucją za pomocą WorkspaceAPI. Pisząc różne narzędzia dla programistów, oprócz analizy kodu, zwykle chcemy mieć informacje o kontekście danego kodu – np. nazwie pliku czy projekcie w którym znajduje się dana klasa. Workspace API, jak nie trudno domyślić się, opiera się na abstrakcyjnej klasie Workspace. Zwykle jednak pracować będziemy z MSBuildWorkspace, która pozwala nam zarządzać .sln czy .csproj:MSBuildWorkspace msWorkspace = M...
W poprzednim wpisie przedstawiłem klasę CSharpSyntaxWalker – przydatną przy analizie drzewa kodu. Dzięki niej, automatycznie bez pisania kodu rekurencyjnego jesteśmy w stanie przejść przez każdy element kodu. Dzisiaj o analogicznym rozwiązaniu ale służącym do przepisywania kodu a nie tylko jego analizowania. Mechanizm działa bardzo podobnie do CSharpSyntaxWalker. Wystarczy, że stworzymy klasę dziedziczącą po CSharpSyntaxRewriter:publicclass CustomRewriter : CSharpSyntaxRewriter { publicoverride Synt...
W ostatnim poście pokazałem jak za pomocą LINQ można przeglądać drzewo kodu. Czasami jest to jednak niewygodne. Załóżmy, że piszemy konwerter z C# na jakiś inny język. W takiej sytuacji, prawdopodobnie chcemy mieć dostęp do każdego elementu kodu. Możemy to zrobić za pomocą LINQ, ale jest to mało wygodne. Musielibyśmy pisać kod rekurencyjny, który dla skomplikowanych kodów jest jak wiadomo mało wydajny, a nawet może zakończyć się wyjątkiem OutOfMemory. Do dyspozycji jednak mamy klasę CSharpSyntaxWalker. ...
Sztuka programowania 3424 dni, 2 godziny, 19 minut temu 130 źrodło rozwiń
Analiza kodu za pomocą LINQ to chyba esencja Roslyn. Bez Roslyn, kod był dla nas jak zwykły tekst (string) i w przypadku jakiejkolwiek analizy, musieliśmy sami parsować tekst i rozpoznawać odpowiednie fragmenty....
W poprzednim wpisie, w dużym skrócie przedstawiłem po co powstał Roslyn i komu może przydać się. W kilku kolejnych postach, zaprezentuję w praktyce jego najważniejsze funkcje. Zaczynami od scripting API. APi szczególnie przydatne w przypadku edytorów do gier czy bardziej zaawansowanych reguł biznesowych. Zacznijmy od klasycznego “hello world”...
O projekcie Roslyn od dawna już słychać, ale jeszcze nigdy nie miałem okazji z niego poważnie korzystać, ani wspomnieć o tym na blogu. Czym jest więc Roslyn? W skrócie pisząc jest to “compiler as service”. Roslyn dostarcza API za pomocą, którego możemy komunikować się kompilatorem. Możemy zatem pisać programy, które rozpoznają kod (C#) i mogą go dynamicznie wykonywać. Innymi słowy, dzięki Roslyn jesteśmy w stanie załadować kod w formie czystego tekstu i w pamięci analizować go już jako strukturę dany...
Wraz z pojawieniem się Roslyn, powstaje wiele interesujących narzędzi. Jednym z nich jest Alive, zachęcam do obejrzenia tego video: https://youtu.be/YipNsoTapho W skrócie – pozwala wykonywać kod w tle, co oznacza, że wiele błędów będziemy w stanie wykrywać na etapie design a nie runtime. Bardzo przypomina nCrunch, ale jeszcze bardziej usprawnia ten proces…
Od pierwszego CTP Roslyna z niecierpliwością czekam na release. W telegraficznym skrócie roslyn to nowa generacja kompilatora. Takiego kompilatora gdzie każdy element jest dostępny przez api/serwis. To otwiera takie możliwości jak budowa własnych narzędzi do refaktoryzacji czy analizy kodu, tworzenie nowych słów kluczowych i nie wiadomo co jeszcze. Przy okazji kompilator jest przepisywany tak aby był szybszy od obecnych. Generalnie Roslyn = mnóstwo gorących i ciekawych rzeczy. Dzisiaj, a w...
SyntaxWalker służy do rekursywnego odwiedzania wszystkich węzłów drzewa składni. Za pomocą SyntaxWalker można zbadać/odczytać strukturę kodu: using System; using System.Collections.Generic; using System.Linq; using Roslyn.Compilers.CSharp; namespace GettingStartedCS { class SyntaxWalkerTest { private static string source = @" using System; using System.Collections; using System.Linq; using System.Text; ...
Co należy zrobić, by pobawić się Roslyn syntax visualizer: Pobrać i zainstalować RoslynCTP http://www.microsoft.com/download/en/details.aspx?id=27746, Start -> Microsoft Codename Roslyn CTP -> Getting Started, Otworzyć i uruchomić (F5) solucję Syntax Visualizer Extension, W nowej instancji, która się otworzy Visual Studio wybrać Edit -> Other Windows -> Roslyn Syntax Visualizer, Stworzyć dowolny nowy projekt, na przykład aplikację konsolową, Teraz można podglądać drzewo składni p...
Wiele osób zna zapewne CodeDOM – bibliotekę, która pozwala generować kod źródłowy przez budowanie go z „klocków” opisujących każdy element kodu: deklarację metody, przypisanie wartości do zmiennej, itp. Nie dało się jednak w łatwy sposób wykonać operacji odwrotnej, tj. zamiany tekstu na drzewo obiektów, które można by łatwo i wygodnie analizować. Problem ten doprowadził to powstania kilku parserów kodu napisanego w C# – na potrzeby kompilatora, środowiska...