Pavel Novotný

.NET Framework, SharePoint, Dynamics CRM, RC Helicopters, Honda VFR CrossRunner

Error 348: Compilation failed. Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.

Tuto chybu jsem tak nějak nepochopil, zřejmě je to bug ve Visual Studiu 2010. Projekt nelze kompilovat a hlásí to chybu “error 348: Compilation failed. Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.”

Na jediné řešení na které jsem přišel je, že je potřeba otevřít .csproj v poznámkovém bloku a odstranit elementy <ProjectTypeGuids>, následně znovu otevřít projekt.

Zvláštní, ale funguje to.

ILSpy–nová alternativa k již placenému RedGate .NET Reflector

Společnost RedGate se bohužel rozhodla zpoplatnit asi nejznámější produkt mezi .NET vývojáři, a to produktu .NET Reflector (http://www.reflector.net/).

Tento produkt měl sice spoustu much, ale hodně krát nám pomohl objasnit chování některých nedeterministických funkcí a knihoven, zejména v SharePointu. To co mě mrzí nejvíce není ani samotné zpoplatnění (v celku zanedbatelných 35 USD), ale to že RedGate na tom od převzetí od vývojáře Lutz Roedera  v roce 2008 neudělal vůbec nic! Tedy integraci do menu Visual Studia nepovažuji za pokrok.

    

Naštěstí se objevila další open source alternativa jménem ILSpy: http://wiki.sharpdevelop.net/ilspy.ashx

image

 

Která je až nápadně podobná .NET Reflectoru, takže přechod není tak bolestný Obličej s očima v sloup 

Samotný ILSpy je ale založený na UI WPF, .NET Reflector stále využívá Windows Forms. To ale samozřejmě není z pohledu funkčnosti důležité, hlavní jsou skutečné features:

ILSpy Features

  • Assembly browsing
  • IL Disassembly
  • Decompilation to C#
    • Supports lambdas and 'yield return'
  • Saving of resources
  • Search for types/methods/properties (substring)
  • Hyperlink-based type/method/property navigation
  • Base/Derived types navigation
  • Navigation history
  • BAML to XAML decompiler
  • Save Assembly as C# Project
  • Find usage of field/method
  • Extensibile via plugins (MEF)

 

ILSpy Roadmap

  • Improve the decompiler
    • Add support for object initializers
  • Assembly Lists
  • Improve search performance
  • Debugger
  • Bookmarks
  • Find usage of type/property/event

 

Stránka projektu: http://wiki.sharpdevelop.net/ilspy.ashx

Twitter: http://twitter.com/ilspy

Nelze modifikovat nastavení IIS WAMREG admin Service – nastavení DCOM je zašednuté/disabled na Windows Server 2008 R2

Problém je v tom, že aktuálně přihlášený uživatel nemá přístup k danému klíči v registrech systému.

Konkrétně jde o klíč v registrech:

HKEY_CLASSES_ROOT\AppID\{61738644-F196-11D0-9953-00C04FD919C1}

Aby jste tedy mohli změnit nastavení konkrétního DCOM objektu, je potřeba provést změnu nastavení v registrech a tento klíč přiřadit vlastníkům ze skupiny Administrators.

Pokud nyní zavřete správu DCOM objektů a znovu otevřete, již bude možné modifikovat nastavení IIS WAMREG admin Service DCOM objektu.

Zjištění typu platformy Windows 32bit/x64 v C#

Viděl jsem několik možností jak zjistit o jaký druh platformy se jedná, od absurdní kontroly existence adresáře “Program Files (x86)” (a ještě fixně na disku C), přes kontrolu environment variables, až po docela zajímavou konstrukci

public bool Is64bit() {
    return Marshal.SizeOf(typeof(IntPtr)) == 8;
}

Tuto funkce jsem sice nezkoušel, ale podle mého názoru určitě nebude fungovat pokud změníte target platform v projektu na 32bit a použijete tuto funkci na x64.

Nakonec mi přišlo nejrozumnější volat API funkci Windows (nemusel jsem řešit problém s unsafe assembly):

Více...

TFS 2010: No connection could be made because the target machine actively refused it.

Pokud si nainstalujete Team Foundation Server 2010 a zobrazuje se Vám tato hláška při snaze vygenerovat report: “No connection could be made because the target machine actively refused it.”

Stačí pouze spustit Windows službu “SQL Server Analysis Services”  a nastavit jí spouštění na automatic :)

Snad to někomu ušetří hodiny hledání chyb v nastavení Reporting Services…..

Pozor na ukládání aplikačních parametrů do SPWeb.Properties

Už jsem za svou praxi s vývojem aplikací pro Sharepoint viděl spoustu custom řešení/rozšíření, spousta z nich má však jednu pěknou vlastnost, a to že svá různá nastavení zapisuje do property bagu SPWeb.Properties. Na tom by samo o sobě nebylo nic špatného, špatné je to, že někteří jedinci (i tzv. “specialisti” a velké SW firmy) tam zapisují data typu hesla zcela nešifrovaně v plaintextu, případně v nějaké serializované XML struktuře!!! Není nic jednoduššího, než si otevřít Sharepoint Designer a přes menu Site –> Site Settings –> záložka Parameters si zobrazit kompletní seznam oněch parametrů, heslo si přečíst a použít… Nemyslím, že by byl takový problém alespoň ono heslo zašifrovat pomocí TripleDES /statické klíče mohou být v assembly, ty už běžný správce nebo editor obsahu hledat nebude/.

 

image 

image

BlogEngine.NET Extension: nastavení data vytvoření a popisku galerie

O původním rozšíření galerie pro BlogEngine.NET načítané z Sharepointu se dočtete zde:

http://www.pavelnovotny.info/post/BlogEngineNET-Extension-zobrazeni-lightbox-galerie-obrazku-ziskane-z-Sharepointu-(WSS-MOSS).aspx

 

Nyní jsem projekt malinko upravil tak, aby bylo možné uložit ke každé galerii popisek a její datum vytvoření, protože v předchozí verzi se jako datum vytvoření zobrazoval pouze datum vytvoření samotné knihovny, nešlo tedy alespoň trošku intuitivně nastavit zpětný datum.

Nyní je to možné v nastavení knihovny:

image

image

Zde je možné stejně jako přes menu akcí povolit přístup k vybrané galerii, nastavit datum pořízení + víceřádkový popis galerie. Výsledné zobrazení je možné si prohlédnout zde:

http://www.pavelnovotny.info/SharepointExtensions/Gallery.aspx

 

Aktualizovaná verze zdrojových souborů a instalačního balíku je opět zde:

http://www.pavelnovotny.info/public/BlogEngineExtensions.zip

BlogEngine.NET Extension: zobrazení lightbox galerie obrázků získané z Sharepointu (WSS/MOSS)

Úvodem bych chtěl upozornit, že tento post byl v úplném počátku motivován soutěží MSDN - "Dokážeš to", později při vývoji rozšíření jsem si ale uvědomil, že něco takového jsem vlastně stejně potřeboval a v mém případě /možná trošku už šílenství/, kdy Sharepoint používám i pro domácí účely /výpočty příjmů/nákladů domácnosti, daní, katalogu e-books, diskusím v rámci rodiny, sdílení kontaktů atd), se mi velice hodí, protože mohu takto jednoduše bez opuštění domácího portálu publikovat fotografie na internet = a nejen já, ale i další rodinný příslušníci (ty ale radši mají aktivované schvalovací workflow :). Na různých místech kódu je patrné, že jsem si také připravoval půdu pro publikování dokumentů, to jsem do této verze nestihl = což by ale nemuselo této ukázce možné integrace nijak vadit. Tento post se pokusím napsat tak, aby byl pochopitelný i pro neznalce Sharepointu, ale když tak pište.

O čem je Sharepoint nebudu zdlouhavě popisovat a vypůjčím si z webu MS tento odstavec: Více...

MOSS: nastavení práv pro guest uživatele u publishing site

Aby nemohl anonymní uživatel přistupující k publishing site portálu prohlížet všechny listy, formuláře, položky ve standardních formulářích listů WSS, je potřeba pro příslušnou site nastavit práva pro uživatele guest. Nastavit práva je samozřejmě možné přes administraci, lepším a spolehlivějším řešením je určitě takové nastavení provést při aktivaci feature našeho projektu /omezující lidskou chybu/.

internal static void LockDownViewFormPages(SPWeb web)
{
    RunWithWebCulture(web, delegate
    {
        ConfirmNotCentralAdminWebApp(web);
        SPRoleDefinition byType = web.RoleDefinitions.GetByType(SPRoleType.Guest);
        byType.BasePermissions = SPBasePermissions.BrowseDirectories |
                                 SPBasePermissions.Open |
                                 SPBasePermissions.OpenItems |
                                 SPBasePermissions.ViewPages;
        byType.Update();
    });
}

Takto to lze samozřejmě použít i v "pouhém" WSS pro jiné účely/skupiny uživatelů.

Poznámka: SPBasePermissions.BrowseDirectories je potřeba, jinak nejde zjistit default stránka pomocí "PublishingWeb.DefaultPage"