Vítejte na blog.vyvojar.cz Přihlásit | Registrovat | Pomoc

Blog Rupra a Engina

Programovat znamená 2 hodiny přemýšlet jak to za 5 minut osr* ehm vyběhnout.
Generování dokumentace VS2005 přes NDoc

Tak jsem po dlouhé době pohledal, či se nepohl projekt NDoc pro VS2005 a FW2.0 a ejhle. Po trochu boji to funguje. Takže jak na to?

 Na stránkách sourceForge se jako klasicky dá najít několik projektů (binaries nebo src). Binaries bohužel obsahují kompilační chyby. My se zaměříme na naše překompilované sources s některými sekcemi zdrojového kódu, které budeme muset opravit. Takže:

 1) Potřebujeme src od projektu NDoc 2005 BetaRelease, které nalezneme na

http://sourceforge.net/project/showfiles.php?group_id=163095&package_id=184303&release_id=411019

odkazem NDoc2005BetaSrc.zip.

2) Rozbalíme, otevřeme ve studiu a je třeba provést změnu v souboru .\Msdn\MsdnHtmlUtilitiesV20.cs záměnou obsahu metody InitializeNamespace() za tento kód:

        /// <summary>
        /// Initialize namespace dictionary
        /// </summary>
        public static void InitializeNamespaces(Project project)
        {
            // If we don't have namespaces list yet, go through each referenced assembly,
            // load the assembly, get the types, then cache the namespaces for all public types.
            if (namespaces.Count == 0)
            {
                foreach (AssemblySlashDoc doc in project.AssemblySlashDocs)
                {
                    //
                    string strDllFullPath = doc.Assembly.Path;
                    string strDllPath = strDllFullPath.Substring(
                        0, strDllFullPath.LastIndexOf(@"\") + 1);
                    //

                    Assembly theAssembly = Assembly.LoadFrom(doc.Assembly);
                    AssemblyName[] assemblies = theAssembly.GetReferencedAssemblies();

                    foreach (AssemblyName an in assemblies)
                    {
                        //Assembly assembly = Assembly.LoadWithPartialName(an.Name);
                        Assembly assembly = null;
                        try
                        {
                            assembly = Assembly.LoadFrom(strDllPath + an.Name + ".dll");
                        }

                        catch (Exception ex)
                        {
                            try
                            {
                                assembly = Assembly.Load(an.FullName);
                            }

                            catch (Exception ex1)
                            {
                                continue;
                            }
                        }

                        if (assembly == null)
                        {
                            throw new System.IO.FileNotFoundException(
                                String.Concat(
                                    "Unable to locate the referenced Assembly ", an.Name));
                        }

                        Type[] assemblyTypes = assembly.GetTypes();

                        foreach (Type type in assemblyTypes)
                        {
                            if (type.IsPublic)
                            {
                                namespaces[type.Namespace] = 
                                    type.Namespace.Replace('.', '_') + '_';
                                namespaces[type.Namespace.Replace(".", "")] = 
                                    type.Namespace.Replace('.', '_') + '_';
                            }
                        }
                    }
                }
            }
        }

        (zdroj : http://geekswithblogs.net/SudheersBlog/archive/2006/07/24/86146.aspx)

3) Dalším problém je, že zdroje (xslt, css, aj. soubory) jsou definovány relativně vzhledem ke kompilovatelné verzi.  Proto funkčnost samotných zkompilových souborů je třeba udělat 2 věci (ve zdrojových souborech upravit string zdroje dat, a do složky s výstupem přidat složky se šablonami.

Funkční verzi jsem upravil pouze pro výstup MSDN (pro mě jediný potřebný - zatím):

3a) v projektu MSDN do souboru StyleSheetCollection.cs přidat definici

#define RELEASE_RESOURCES

a následně v metodě LoadStyleSheets nahradit celou sekci #if NO_RESOURCES ... #endif za například toto:

#if RELEASE_RESOURCES
         string resourceBase = "file://" + Path.GetFullPath(
            Path.Combine(System.Windows.Forms.Application.StartupPath, @"Msdn\xslt"));
#else
#if NO_RESOURCES
	string resourceBase = "file://" + Path.GetFullPath(
            Path.Combine(
                System.Windows.Forms.Application.StartupPath, 
                @"..\..\..\Documenter\Msdn\xslt") );
#else
         string resourceBase = "NDoc.Documenter.Msdn.xslt";
#endif
#endif

3b) Ve výstupní složce vytvoříme novou složku nazvanou "MSDN" a vykopírujeme do ní z projektu MSDN podsložky CSS, Images, OnlineFiles, OnlineTemplates a xslt.

4) Zkompilujeme, spustíme a projekt by měl fungovat.

ENG

 Zdroje:

http://www.wwwcoder.com/main/parentid/263/site/6246/68/default.aspx

http://geekswithblogs.net/SudheersBlog/archive/2006/07/24/86146.aspx

http://sourceforge.net/tracker/index.php?func=detail&aid=1479548&group_id=163095&atid=826379

http://forums.microsoft.com/msdn/showpost.aspx?postid=111392&siteid=1&sb=0&d=1&at=7&ft=11&tf=0&pageid=1

 

 

PS:

Při rozcházení NDoc05 se nejčastěji objevují 2 základní chyby:

  • Could not find a part of the path <nějaká cesta>\Msdn\xslt\namespace.xslt'. - je způsobenou pevnou cestou určenou při kompilaci balíku a vyskytuje se pouze u binárních verzí. U verzí vycházejíccíh ze zdrojových souborů (náš případ) se při překompilování cesta nahradí správnou a chyba nenastane;
  • Falied to load Assembly <název>- je zase chyba, která se vyskytuje při nenahrazení metody InitializeNamespaces() uvedené v bodě 2.
Posted: Thursday, June 14, 2007 9:17 AM by ruprt

Komentář

Jan Aubrecht napsal:

A není lepší místo NDoc použít SandCastle, který funguje spolu s .NET Framework 2.0 docela spolehlivě?

http://www.microsoft.com/downloads/details.aspx?FamilyID=e82ea71d-da89-42ee-a715-696e3a4873b2&DisplayLang=en

Dokonce pro něj existuje i docela příjemné GUI:

http://www.codeplex.com/SHFB

# June 14, 2007 10:56 AM

Maertin Darilek napsal:

Hmm i tak mi to pada na Exception:

Method may only be called on a Type for which Type.IsGenericParameter is true.

ach jo

# June 14, 2007 1:29 PM

ruprt napsal:

Ad Jakub Aubrecht:

Tak je to alternativou, co se týče použití např. pro ty, co jsou na NDoc zvyklí.

Přiznám se že SandCastle jsem neznal, dneska ráno jsem to nainstaloval (po komentáři) ale nepodařilo se mi z toho dokumentaci vygenerovat kvůli podivné chybě (u třídy realizující šablonu rozhranní) - budu se tím zaobývat jindy, takže bohužel ani nevím jaký/é druh/y výstupu to podporuje.

Ad Maertin Darilek:

Na to jsem našel jedinou referenci na http://geekswithblogs.net/mnf/archive/2006/01/05/64880.aspx. Nejedná se o DNN projekt? Jestli ano, vyzkouším (až bude čas :().

# June 14, 2007 2:01 PM

Martin Darilek napsal:

Zkousel jsem to na generovani dokumentace k CSLA.NET, kde se hojne vyuziva generika.

Ad Sandcastle, jedna se uz o celkem funkcni projekt zejmena v kombinaci se SHFB (i kdyz existuji i jine doplnkove nastroje). Moc se mi ale zatim nelibi format vysledku. Formatovani vystupu ala VS2005 i ten Prototype maji sve mouchy.

# June 14, 2007 3:12 PM
Nejsou povoleny nové komentáře k tomuto příspěvku