Giter VIP home page Giter VIP logo

api-doc-tools's Introduction

Mono is a software platform designed to allow developers to easily create cross platform applications. It is an open source implementation of Microsoft's .NET Framework based on the ECMA standards for C# and the Common Language Runtime.

The Mono project is part of the .NET Foundation

Important

The Mono Project (mono/mono) (‘original mono’) has been an important part of the .NET ecosystem since it was launched in 2001. Microsoft became the steward of the Mono Project when it acquired Xamarin in 2016.

The last major release of the Mono Project was in July 2019, with minor patch releases since that time. The last patch release was February 2024.

We are happy to announce that the WineHQ organization will be taking over as the stewards of the Mono Project upstream at wine-mono / Mono · GitLab (winehq.org). Source code in existing mono/mono and other repos will remain available, although repos may be archived. Binaries will remain available for up to four years.

Microsoft maintains a modern fork of Mono runtime in the dotnet/runtime repo and has been progressively moving workloads to that fork. That work is now complete, and we recommend that active Mono users and maintainers of Mono-based app frameworks migrate to .NET which includes work from this fork.

We want to recognize that the Mono Project was the first .NET implementation on Android, iOS, Linux, and other operating systems. The Mono Project was a trailblazer for the .NET platform across many operating systems. It helped make cross-platform .NET a reality and enabled .NET in many new places and we appreciate the work of those who came before us.

Thank you to all the Mono developers!

Join us on Discord in the #monovm channel:

Contents

  1. Compilation and Installation
  2. Using Mono
  3. Directory Roadmap
  4. Contributing to Mono
  5. Reporting bugs
  6. Configuration Options
  7. Working with Submodules

Build Status

Public CI: Azure Pipelines

Legacy Jenkins CI (no longer available publicly):

OS Architecture Status
Debian 9 amd64 debian-9-amd64
Debian 9 i386 debian-9-i386
Debian 9 armel debian-9-armel
Debian 9 armhf debian-9-armhf
Debian 9 arm64 debian-9-arm64
OS X amd64 osx-amd64
OS X i386 osx-i386
Windows amd64 windows-amd64
Windows i386 windows-i386
CentOS s390x (cs) centos-s390x
Debian 9 ppc64el (cs) debian-9-ppc64el
AIX 6.1 ppc64 (cs) aix-ppc64
FreeBSD 12 amd64 (cs) freebsd-amd64

(cs) = community supported architecture

Compilation and Installation

Building the Software

Please see our guides for building Mono on Mac OS X, Linux and Windows.

Note that building from Git assumes that you already have Mono installed, so please download and install the latest Mono release before trying to build from Git. This is required because the Mono build relies on a working Mono C# compiler to compile itself (also known as bootstrapping).

If you don't have a working Mono installation

If you don't have a working Mono installation, you can try a slightly more risky approach: getting the latest version of the 'monolite' distribution, which contains just enough to run the 'mcs' compiler. You do this with:

# Run the following line after ./autogen.sh
make get-monolite-latest

This will download and place the files appropriately so that you can then just run:

make

The build will then use the files downloaded by make get-monolite-latest.

Testing and Installation

You can run the mono and mcs test suites with the command: make check.

Expect to find a few test suite failures. As a sanity check, you can compare the failures you got with https://jenkins.mono-project.com/.

You can now install mono with: make install

You can verify your installation by using the mono-test-install script, it can diagnose some common problems with Mono's install. Failure to follow these steps may result in a broken installation.

Using Mono

Once you have installed the software, you can run a few programs:

  • mono program.exe runtime engine

  • mcs program.cs C# compiler

  • monodis program.exe CIL Disassembler

See the man pages for mono(1), mcs(1) and monodis(1) for further details.

Directory Roadmap

  • acceptance-tests/ - Optional third party test suites used to validate Mono against a wider range of test cases.

  • data/ - Configuration files installed as part of the Mono runtime.

  • docs/ - Technical documents about the Mono runtime.

  • external/ - Git submodules for external libraries (Newtonsoft.Json, ikvm, etc).

  • ikvm-native/ - Glue code for ikvm.

  • libgc/ - The (deprecated) Boehm GC implementation.

  • llvm/ - Utility Makefiles for integrating the Mono LLVM fork.

  • m4/ - General utility Makefiles.

  • man/ - Manual pages for the various Mono commands and programs.

  • mcs/ - The class libraries, compiler and tools

    • class/ - The class libraries (like System.*, Microsoft.Build, etc.)

    • mcs/ - The Mono C# compiler written in C#

    • tools/ - Tools like gacutil, ikdasm, mdoc, etc.

  • mono/ - The core of the Mono Runtime.

    • arch/ - Architecture specific portions.

    • benchmark/ - A collection of benchmarks.

    • btls/ - Build files for the BTLS library which incorporates BoringSSL.

    • cil/ - Common Intermediate Representation, XML definition of the CIL bytecodes.

    • dis/ - CIL executable Disassembler.

    • eglib/ - Independent implementation of the glib API.

    • metadata/ - The object system and metadata reader.

    • mini/ - The Just in Time Compiler.

    • profiler/ - The profiler implementation.

    • sgen/ - The SGen Garbage Collector implementation.

    • tests/ - The main runtime tests.

    • unit-tests/ - Additional runtime unit tests.

    • utils/ - Utility functions used across the runtime codebase.

  • msvc/ - Logic for the MSVC / Visual Studio based runtime and BCL build system. The latter is experimental at the moment.

  • packaging/ - Packaging logic for the OS X and Windows Mono packages.

  • po/ - Translation files.

  • runtime/ - A directory that contains the Makefiles that link the mono/ and mcs/ build systems.

  • samples/ - Some simple sample programs on uses of the Mono runtime as an embedded library.

  • scripts/ - Scripts used to invoke Mono and the corresponding program.

  • support/ - Various support libraries.

  • tools/ - A collection of tools, mostly used during Mono development.

Contributing to Mono

Before submitting changes to Mono, please review the contribution guidelines. Please pay particular attention to the Important Rules section.

Reporting bugs

To submit bug reports, please open an issue on the mono GitHub repo.

Please use the search facility to ensure the same bug hasn't already been submitted and follow our guidelines on how to make a good bug report.

Configuration Options

The following are the configuration options that someone building Mono might want to use:

  • --with-sgen=yes,no - Generational GC support: Used to enable or disable the compilation of a Mono runtime with the SGen garbage collector.

    • On platforms that support it, after building Mono, you will have both a mono-boehm binary and a mono-sgen binary. mono-boehm uses Boehm, while mono-sgen uses the Simple Generational GC.
  • --with-libgc=[included, none] - Selects the default Boehm garbage collector engine to use.

    • included: (slightly modified Boehm GC) This is the default value for the Boehm GC, and it's the most feature complete, it will allow Mono to use typed allocations and support the debugger.

    • none: Disables the inclusion of a Boehm garbage collector.

    • This defaults to included.

  • --enable-cooperative-suspend

    • If you pass this flag the Mono runtime is configured to only use the cooperative mode of the garbage collector. If you do not pass this flag, then you can control at runtime the use of the cooperative GC mode by setting the MONO_ENABLE_COOP_SUSPEND flag.
  • --with-tls=__thread,pthread

    • Controls how Mono should access thread local storage, pthread forces Mono to use the pthread APIs, while __thread uses compiler-optimized access to it.

    • Although __thread is faster, it requires support from the compiler, kernel and libc. Old Linux systems do not support with __thread.

    • This value is typically pre-configured and there is no need to set it, unless you are trying to debug a problem.

  • --with-sigaltstack=yes,no

    • Experimental: Use at your own risk, it is known to cause problems with garbage collection and is hard to reproduce those bugs.

    • This controls whether Mono will install a special signal handler to handle stack overflows. If set to yes, it will turn stack overflows into the StackOverflowException. Otherwise when a stack overflow happens, your program will receive a segmentation fault.

    • The configure script will try to detect if your operating system supports this. Some older Linux systems do not support this feature, or you might want to override the auto-detection.

  • --with-static_mono=yes,no

    • This controls whether mono should link against a static library (libmono.a) or a shared library (libmono.so).

    • This defaults to yes, and will improve the performance of the mono program.

    • This only affects the `mono' binary, the shared library libmono.so will always be produced for developers that want to embed the runtime in their application.

  • --with-xen-opt=yes,no - Optimize code for Xen virtualization.

    • It makes Mono generate code which might be slightly slower on average systems, but the resulting executable will run faster under the Xen virtualization system.

    • This defaults to yes.

  • --with-large-heap=yes,no - Enable support for GC heaps larger than 3GB.

    • This only applies only to the Boehm garbage collector, the SGen garbage collector does not use this configuration option.

    • This defaults to no.

  • --enable-small-config=yes,no - Enable some tweaks to reduce memory usage and disk footprint at the expense of some capabilities.

    • Typically this means that the number of threads that can be created is limited (256), that the maximum heap size is also reduced (256 MB) and other such limitations that still make mono useful, but more suitable to embedded devices (like mobile phones).

    • This defaults to no.

  • --with-ikvm-native=yes,no - Controls whether the IKVM JNI interface library is built or not.

    • This is used if you are planning on using the IKVM Java Virtual machine with Mono.

    • This defaults to yes.

  • --with-profile4=yes,no - Whether you want to build the 4.x profile libraries and runtime.

    • This defaults to yes.
  • --with-libgdiplus=installed,sibling,<path> - Configure where Mono searches for libgdiplus when running System.Drawing tests.

    • It defaults to installed, which means that the library is available to Mono through the regular system setup.

    • sibling can be used to specify that a libgdiplus that resides as a sibling of this directory (mono) should be used.

  • Or you can specify a path to a libgdiplus.

  • --enable-minimal=LIST

    • Use this feature to specify optional runtime components that you might not want to include. This is only useful for developers embedding Mono that require a subset of Mono functionality.

    • The list is a comma-separated list of components that should be removed, these are:

      • aot: Disables support for the Ahead of Time compilation.

      • attach: Support for the Mono.Management assembly and the VMAttach API (allowing code to be injected into a target VM)

      • com: Disables COM support.

      • debug: Drop debugging support.

      • decimal: Disables support for System.Decimal.

      • full_messages: By default Mono comes with a full table of messages for error codes. This feature turns off uncommon error messages and reduces the runtime size.

      • generics: Generics support. Disabling this will not allow Mono to run any 2.0 libraries or code that contains generics.

      • jit: Removes the JIT engine from the build, this reduces the executable size, and requires that all code executed by the virtual machine be compiled with Full AOT before execution.

      • large_code: Disables support for large assemblies.

      • logging: Disables support for debug logging.

      • pinvoke: Support for Platform Invocation services, disabling this will drop support for any libraries using DllImport.

      • portability: Removes support for MONO_IOMAP, the environment variables for simplifying porting applications that are case-insensitive and that mix the Unix and Windows path separators.

      • profiler: Disables support for the default profiler.

      • reflection_emit: Drop System.Reflection.Emit support

      • reflection_emit_save: Drop support for saving dynamically created assemblies (AssemblyBuilderAccess.Save) in System.Reflection.Emit.

      • shadow_copy: Disables support for AppDomain's shadow copies (you can disable this if you do not plan on using appdomains).

      • simd: Disables support for the Mono.SIMD intrinsics library.

      • ssa: Disables compilation for the SSA optimization framework, and the various SSA-based optimizations.

  • --enable-llvm

    • This enables the use of LLVM as a code generation engine for Mono. The LLVM code generator and optimizer will be used instead of Mono's built-in code generator for both Just in Time and Ahead of Time compilations.

    • See https://www.mono-project.com/docs/advanced/mono-llvm/ for the full details and up-to-date information on this feature.

    • You will need to have an LLVM built that Mono can link against.

  • --enable-big-arrays - Enable use of arrays with indexes larger than Int32.MaxValue.

    • By default Mono has the same limitation as .NET on Win32 and Win64 and limits array indexes to 32-bit values (even on 64-bit systems).

    • In certain scenarios where large arrays are required, you can pass this flag and Mono will be built to support 64-bit arrays.

    • This is not the default as it breaks the C embedding ABI that we have exposed through the Mono development cycle.

  • --enable-parallel-mark

    • Use this option to enable the garbage collector to use multiple CPUs to do its work. This helps performance on multi-CPU machines as the work is divided across CPUS.

    • This option is not currently the default on OSX as it runs into issues there.

    • This option only applies to the Boehm GC.

  • --enable-dtrace

    • On Solaris and MacOS X builds a version of the Mono runtime that contains DTrace probes and can participate in the system profiling using DTrace.
  • --disable-dev-random

    • Mono uses /dev/random to obtain good random data for any source that requires random numbers. If your system does not support this, you might want to disable it.

    • There are a number of runtime options to control this also, see the man page.

  • --with-csc=roslyn,mcs,default

    • Use this option to configure which C# compiler to use. By default the configure script will pick Roslyn, except on platforms where Roslyn does not work (Big Endian systems) where it will pick mcs.

      If you specify "mcs", then Mono's C# compiler will be used. This also allows for a complete bootstrap of Mono's core compiler and core libraries from source.

  If you specify "roslyn", then Roslyn's C# compiler will be used. This currently uses Roslyn binaries.

  • --enable-nacl

    • This configures the Mono compiler to generate code suitable to be used by Google's Native Client: https://code.google.com/p/nativeclient/

    • Currently this is used with Mono's AOT engine as Native Client does not support JIT engines yet.

  • --enable-wasm

    • Use this option to configure mono to run on WebAssembly. It will set both host and target to the WebAssembly triplet. This overrides the values passed to --host or --target and ignored what config.sub guesses.

      This is a workaround to enable usage of old automake versions that don't recognize the wasm triplet.

Working With Submodules

Mono references several external git submodules, for example a fork of Microsoft's reference source code that has been altered to be suitable for use with the Mono runtime.

This section describes how to use it.

An initial clone should be done recursively so all submodules will also be cloned in a single pass:

$ git clone --recursive [email protected]:mono/mono

Once cloned, submodules can be updated to pull down the latest changes. This can also be done after an initial non-recursive clone:

$ git submodule update --init --recursive

To pull external changes into a submodule:

$ cd <submodule>
$ git pull origin <branch>
$ cd <top-level>
$ git add <submodule>
$ git commit

By default, submodules are detached because they point to a specific commit. Use git checkout to move back to a branch before making changes:

$ cd <submodule>
$ git checkout <branch>
# work as normal; the submodule is a normal repo
$ git commit/push new changes to the repo (submodule)

$ cd <top-level>
$ git add <submodule> # this will record the new commits to the submodule
$ git commit

To switch the repo of a submodule (this should not be a common or normal thing to do at all), first edit .gitmodules to point to the new location, then:

$ git submodule sync -- <path of the submodule>
$ git submodule update --recursive
$ git checkout <desired new hash or branch>

The desired output diff is a change in .gitmodules to reflect the change in the remote URL, and a change in / where you see the desired change in the commit hash.

License

See the LICENSE file for licensing information, and the PATENTS.TXT file for information about Microsoft's patent grant.

Mono Trademark Use Policy

The use of trademarks and logos for Mono can be found here.

api-doc-tools's People

Contributors

akoeplinger avatar anmeng10101 avatar asokolovskiy15 avatar atsushieno avatar daxianji007 avatar directhex avatar duncanmak avatar garuma avatar harinath avatar hiihellox10 avatar huangmin-ms avatar jeffinchrist avatar jeffreyxrh avatar joelmartinez avatar jonpryor avatar kumpera avatar lobrien avatar maopeixia avatar marek-safar avatar mattleibow avatar migueldeicaza avatar pjcollins avatar rolfbjarne avatar tianqizhang avatar tinaliu02 avatar v-fuquanli avatar v-susu1 avatar v-zazhou avatar vargaz avatar xmdanni avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

api-doc-tools's Issues

[mdoc] System.EnterpriseServices.* are causing breaks

If you try running mdoc on a range of assemblies in the .NET Framework (by default, located in, say C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0), assemblies in the System.EnterpriseServices.* range are causing tool errors (e.g. System.EnterpiseServices.Wrapper.dll):

mdoc: System.ArgumentException: Value does not fall within the expected range.
  at Mono.Cecil.AssemblyDefinition.ReadAssembly (Mono.Cecil.ModuleDefinition module) [0x0000d] in <364321ccd6674266bec9cd4fab3f2d34>:0
  at Mono.Cecil.AssemblyDefinition.ReadAssembly (System.String fileName, Mono.Cecil.ReaderParameters parameters) [0x00007] in <364321ccd6674266bec9cd4fab3f2d34>:0
  at Mono.Documentation.MDocUpdater.LoadAssembly (System.String name) [0x00015] in <ffc07159c23e4de8b7c8063bdf9582a3>:0
  at Mono.Documentation.MDocUpdater+<Run>c__AnonStorey2.<>m__E (System.String a) [0x00000] in <ffc07159c23e4de8b7c8063bdf9582a3>:0
  at System.Linq.Enumerable+WhereSelectListIterator`2[TSource,TResult].MoveNext () [0x00064] in <63992662b765477a898ef49cdcc99ee2>:0
  at System.Collections.Generic.List`1[T]..ctor (System.Collections.Generic.IEnumerable`1[T] collection) [0x0008b] in <8f2c484307284b51944a1a13a14c0266>:0
  at System.Linq.Enumerable.ToList[TSource] (System.Collections.Generic.IEnumerable`1[T] source) [0x00011] in <63992662b765477a898ef49cdcc99ee2>:0
  at Mono.Documentation.MDocUpdater.Run (System.Collections.Generic.IEnumerable`1[T] args) [0x003c0] in <ffc07159c23e4de8b7c8063bdf9582a3>:0
  at Mono.Documentation.MDoc.Run (System.String[] args) [0x001f6] in <ffc07159c23e4de8b7c8063bdf9582a3>:0
  at Mono.Documentation.MDoc.Main (System.String[] args) [0x00006] in <ffc07159c23e4de8b7c8063bdf9582a3>:0

Mdoc unexpectedly duplicates copy into Index.xml; Mdoc doesn't return 0 iff no changes are made

Per discussion with @joelmartinez:

Expected mdoc to not duplicate copy. Actually observed instances where mdoc duplicates copy. Duplicate copy is problematic because it's not clear which duplicate should be updated and if the duplicates diverge it's not clear which one is authoritative.

For example, if I compile an assembly containing a public API, then run mdoc update to generate a xml stub <summary>To be added.</summary>, then replace the stub with copy like <summary>This is a public API.</summary> then I expect running mdoc update again will not change any other files. What actually happens is that mdoc will duplicate the copy into index.xml. This can be seen happening in this PR.

I also expect that if mdoc update makes non-whitespace updates to any file then it return a non-zero error code otherwise it return zero. What actually happens is undocumented and so other less elegant solutions must be employed to discover if mdoc made any changes.


Fixing this issue will allow the XF team to achieve it's goal of (1) failing the build unless every public API has corresponding mdoc xml and (2) having our doc writer be able to update copy without having to build. Currently we're able to (inelegantly) achieve the first goal but not the second the due to this issue.

Here is an elaboration of our doc work flow:

  1. Developer makes changes, builds, and runs this bat file to generate mdoc xml stubs for any new public APIs introduced. The changes and the mdoc xml are both included in the PR.

  2. The CI system enforces mdoc xml is present for every public API by running the same bat file again after the build. The bat file returns 0 (success) iff a copy made of the mdoc xml before the build + mdoc update is the same as the generated mdoc xml. The test for changes is not as simple as just checking the return code of mdoc as its not documented to return zero iff no changes were made. Hence the less elegant method of copy/regenerate/compare is employed by the bat file.

  3. The doc writer submits a PR with updates only to the mdoc xml content and submits the PR. The doc writer does not want to have to have to re-run mdoc update as that would first require the doc writer to build the product. Requiring the doc writer to build is not ideal as configuring and maintaining a box to successfully build is not always a trivial exercise. Unfortunately, due to this bug, the doc writers PR fails CI because mdoc update results duplicates the new copy to index.xml.

<param name=""> Empty param names in <Docs> node

When using xml files from this folder , I found 9 files has empty param names in their <Docs> node, like this one from Microsoft.VisualC.StlClr.Generic\ReverseRandomAccessIterator`1.xml

<Docs>
    <typeparam name="TArg1">To be added.</typeparam>
    <typeparam name="TArg2">To be added.</typeparam>
    <typeparam name="TResult">To be added.</typeparam>
    <param name="">To be added.</param>
    <param name="">To be added.</param>
    <summary>To be added.</summary>
    <returns>To be added.</returns>
    <remarks>To be added.</remarks>
  </Docs>

First, there should not be any <param> node under Type/Docs, secondly, <param>'s name should not be empty.

[mdoc] OutOfMemoryException when running against many frameworks

I am running mdoc against several frameworks, and while the process kicks off OK, somewhere mid-process (after 10+ minutes or running) the app crashes with an OutOfMemoryException:

mdoc: System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
   at System.String.InternalSubString(Int32 startIndex, Int32 length)
   at System.String.Substring(Int32 startIndex, Int32 length)
   at System.IO.Path.GetFileName(String path)
   at Mono.Documentation.AssemblySet.<Contains>c__AnonStorey2.<>m__0(String p)
   at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source, Func`2 predicate)
   at Mono.Documentation.AssemblySet.Contains(String name)
   at Mono.Documentation.MDocUpdater.<IsInAssemblies>c__AnonStorey6.<>m__0(AssemblySet a)
   at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source, Func`2 predicate)
   at Mono.Documentation.MDocUpdater.IsInAssemblies(String name)
   at Mono.Documentation.DocUtils.GetNamespace(TypeReference type)
   at Mono.Documentation.MemberFormatter.AppendNamespace(StringBuilder buf, TypeReference type)
   at Mono.Documentation.MemberFormatter._AppendTypeName(StringBuilder buf, TypeReference type, DynamicParserContext context)
   at Mono.Documentation.MemberFormatter.GetTypeName(TypeReference type, DynamicParserContext context)
   at Mono.Documentation.MemberFormatter.GetName(MemberReference member, DynamicParserContext context)
   at Mono.Documentation.MDocUpdater.<GetCustomAttributes>c__Iterator0.MoveNext()
   at System.Linq.Enumerable.<ConcatIterator>d__58`1.MoveNext()
   at System.Linq.Enumerable.<ConcatIterator>d__58`1.MoveNext()
   at System.Linq.Enumerable.<ConcatIterator>d__58`1.MoveNext()
   at Mono.Documentation.MDocUpdater.MakeAttributes(XmlElement root, IEnumerable`1 attributes, TypeReference t)
   at Mono.Documentation.MDocUpdater.UpdateMember(DocsNodeInfo info, FrameworkTypeEntry typeEntry)
   at Mono.Documentation.MDocUpdater.DoUpdateType2(String message, XmlDocument basefile, TypeDefinition type, FrameworkTypeEntry typeEntry, String output, Boolean insertSince)
   at Mono.Documentation.MDocUpdater.DoUpdateType(TypeDefinition type, FrameworkTypeEntry typeEntry, String basepath, String dest)
   at Mono.Documentation.MDocUpdater.DoUpdateAssembly(AssemblySet assemblySet, AssemblyDefinition assembly, XmlElement index_types, String source, String dest, HashSet`1 goodfiles)
   at Mono.Documentation.MDocUpdater.DoUpdateAssemblies(String source, String dest)
   at Mono.Documentation.MDocUpdater.Run(IEnumerable`1 args)
   at Mono.Documentation.MDoc.Run(String[] args)
   at Mono.Documentation.MDoc.Main(String[] args)
See `mdoc help' for more information or use --debug to diagnose.

My hunch is somewhere in the code there is a List<T> that takes more than 2GB in-memory space. Because mdoc is compiled as a x86 app, that limitation is by design, but we could probably do better.

As a workaround, it is possible to use editbin and run it on the mdoc.exe binary with the /LARGEADDRESSAWARE flag and get a binary that works without the exception.

The proposed fix is to compile mdoc as an amd64 application.

Include `forInternalUseOnly` in HTML output

A new element was added to the XSD, <forInternalUseOnly /> ... it's meant to be a marker, and documentation that contains this element should output:

This API supports the product infrastructure and is not intended to be used directly from your code.

Background information here:
#12 (comment)

[mdoc] Missing types on running mdoc in Frameworks Mode

Download the binaries repo, and use netframework-4.6 as an example. We have mscorlib.dll that contains the primary types there

Now, if I run a standard mdoc update mscorlib.dll -o SOME_LOCATION, I get the System folder, and a String.xml in it

However, now say I run mdoc fx-bootstrap FOLDER_WHERE_NET_FRAMEWORK46_IS

Then mdoc update -fx FOLDER_WHERE_NET_FRAMEWORK46_IS -o TEST_LOCATION

It completes the work BUT now String is nowhere to be found. It's not in FrameworksIndex and it's not in any of the folders

[mdoc] Support extra elements in the generated ECMAXML

Based on the documentation work being done, we'd like to add a number of extra elements to the generated ECMAXML:

  • <examples> - a node that will contain multiple child <example> nodes, or a CDATA-wrapped Markdown representation of example content.
  • <altobsolete> - an element that allows a type that is an alternative to the current obsolete type.
  • <isinternal> - determines whether the API in question is internal or not.

[mdoc][bug] Two assemblies with the same namespace, class and member, but different signatures skip output in ECMAXML

The scenario is that you have two frameworks: DenDeliFramework and DenDeliBestFramework - both have their respective assemblies that can have different names, but within them have exactly the same namespace > type > member mapping.

So, say in DenDeliFramework I have (represented by dendeliframework.dll):

namespace DenDeliFramework
{
    public class President
    {
        public string GetInformation(string requestor)
        {
            string result = $"Requestor was {requestor}";
            return result;
        }
    }
}

In DenDeliBestFramework I have (represented by dendelibestframework.dll):

namespace DenDeliFramework
{
    public class President
    {
        public string GetInformation(string requestor, string meta)
        {
            string result = $"Requestor was {requestor} and {meta}";
            return result;
        }
    }
}

Notice that in the second implementation, GetInformation has a different signature. So once I run mdoc, here is the output:

<Type Name="President" FullName="DenDeliFramework.President">
  <TypeSignature Language="C#" Value="public class President" />
  <TypeSignature Language="ILAsm" Value=".class public auto ansi beforefieldinit President extends System.Object" />
  <AssemblyInfo>
    <AssemblyName>DenDeliBestFramework</AssemblyName>
    <AssemblyVersion>1.0.0.0</AssemblyVersion>
  </AssemblyInfo>
  <AssemblyInfo>
    <AssemblyName>DenDeliFramework</AssemblyName>
    <AssemblyVersion>1.0.0.0</AssemblyVersion>
  </AssemblyInfo>
  <Base>
    <BaseTypeName>System.Object</BaseTypeName>
  </Base>
  <Interfaces />
  <Docs>
    <summary>To be added.</summary>
    <remarks>To be added.</remarks>
  </Docs>
  <Members>
    <Member MemberName=".ctor">
      <MemberSignature Language="C#" Value="public President ();" />
      <MemberSignature Language="ILAsm" Value=".method public hidebysig specialname rtspecialname instance void .ctor() cil managed" />
      <MemberType>Constructor</MemberType>
      <AssemblyInfo>
        <AssemblyVersion>1.0.0.0</AssemblyVersion>
      </AssemblyInfo>
      <Parameters />
      <Docs>
        <summary>To be added.</summary>
        <remarks>To be added.</remarks>
      </Docs>
    </Member>
    <Member MemberName="GetInformation">
      <MemberSignature Language="C#" Value="public string GetInformation (string requestor);" />
      <MemberSignature Language="ILAsm" Value=".method public hidebysig instance string GetInformation(string requestor) cil managed" />
      <MemberType>Method</MemberType>
      <AssemblyInfo>
        <AssemblyVersion>1.0.0.0</AssemblyVersion>
      </AssemblyInfo>
      <ReturnValue>
        <ReturnType>System.String</ReturnType>
      </ReturnValue>
      <Parameters>
        <Parameter Name="requestor" Type="System.String" />
      </Parameters>
      <Docs>
        <param name="requestor">To be added.</param>
        <summary>To be added.</summary>
        <returns>To be added.</returns>
        <remarks>To be added.</remarks>
      </Docs>
    </Member>
  </Members>
</Type>

Notice two things:

  1. The AssemblyName is dropped from the GetInformation member as well as the constructor.
  2. The GetInformation reflection in XML shows the implementation of the signature from DenDeliFramework but completely skipped over DenDeliBestFramework.

This scenario will be especially critical as we try to scale reflection across .NET Framework, .NET Core, .NET Standard and Xamarin BCL since there is a chance some implementations might differ.

Change "To be added." text in deprecated items to something else.

It would make counting unfinished work easier if "To be added." was exclusively reserved for work items that are actually candidates for further work. Deprecated and unavailable items do not satisfy this implied predicate, so it would be nice if classes, structs, enums, and their fields, properties, and methods that are deprecated did not have the "To be added." placeholder text.

mdoc/monodoc should change the boilerplate text for these when it discovers that these items are deprecated.

Enable mdoc to run imports in framework mode

Say, we have the following frameworks:

azsdk-1.0
  |_somelibrary.dll
  |_somelibrary.xml
  |_somelibrary2.dll
  |_somelibrary2.xml
azsdk-2.0
  |_somelibrary.dll
  |_somelibrary.xml
  |_somelibrary2.dll
  |_somelibrary2.xml

The XML files are C# compiler-generated doc XML files. Would be great to have mdoc import the content in framework mode.

Versioning Story

Originally, when this project was a part of the mono project ... the version number was bound to the version of the mono framework/runtime. As will now be moving to out-of-band releases for mdoc, we have to establish a new version number.

Consts.cs holds the version number that is reported when you mdoc --version.

The released/stable version at the time of this project being extracted into this repository was 4.6. I propose that, for the sake of moving cleanly to a new version ... the next release be versioned as 5.0, and propose that this version change go out with #18

Thoughts?

[mdoc] Delta between DocID in FrameworksIndex and type XML

A good example here would be System.Dynamic.ExpandoObject, for which we have the Add member.

In the type XML, we have:

M:System.Dynamic.ExpandoObject.System#Collections#Generic#ICollection&lt;System#Collections#Generic#KeyValuePair&lt;string,object&gt;&gt;#Add(System.Collections.Generic.KeyValuePair{System.String,System.Object})

In FrameworksIndex we have:

M:System.Dynamic.ExpandoObject.System#Collections#Generic#ICollection&lt;System#Collections#Generic#KeyValuePair&lt;System#String,System#Object&gt;&gt;#Add(System.Collections.Generic.KeyValuePair{System.String,System.Object})

The subtle difference here is in how parameter types are resolved - short-aliased vs. FQNs:

#Generic#KeyValuePair&lt;string,object
#Generic#KeyValuePair&lt;System#String,System#Object

In both cases, it should resolve to a FQN.

Expected mdoc to not reformat xml but actually reformats the xml

After a doc writer adds copy he may reformat the whitespace of the xml and I expect mdoc to preserve that whitespace formatting the next time it's run. What actually happens is mdoc re-formats the white space. See PR xamarin/Xamarin.Forms#813.

One may wonder, "What's the big deal? Just have the doc writer re-run mdoc after his edits to ensure it's been reformatted". The problem is that in order to re-run mdoc the doc writer must have first build the product. That's problematic because that requires the doc writer to maintain a working build environment and depending on the maturity of the build that could be challenging.

On XF our goal is to have the developer run mdoc after building locally with changes that add new public APIs so that xml mdoc stubs are generated and can be included in the PR. The build system then enforces that every PR has xml stubs for all new APIs by running mdoc and failing if the generated xml files don't match those submitted in the PR. After the stubs are checked in then the doc writer can fill in those stubs and submit a PR without having to build.

See also: #38. Note that for whatever reason we don't see index.xml updated for the 813 PR.

FrameworksIndex folder should not be empty after mdoc update

With mdoc 5.0.0.9, I found that FrameworksIndex folder is empty after "mdoc update". Here's the repo step:

  • Clone https://apidrop.visualstudio.com/_git/binaries to e:\mdoc\binaries
  • run mdoc.exe fx-bootstrap E:\mdoc\binaries\dotnet, it will generate frameworks.xml under e:\mdoc\binaries\dotnet
  • run mdoc update -o E:\mdoc\mdocTest -fx E:\mdoc\binaries\dotnet\frameworks.xml to generate xml files.
  • You will find E:\mdoc\mdocTest\FrameworksIndex is empty, all the framework indexfiles were put under dll folder E:\mdoc\binaries\dotnet\

Expected behavior:
all the framework index files should be in FrameworksIndex folder.

[mdoc][xml] Generated XML contains 0x00 that breaks the XDocument parser

Available in files such as this.

Getting the following errors when trying to use XDocument.Load(string fileName):

Failed to load E:\apidrop\XMLDevDrop\feb-24-2017\System.Windows.Forms\MaskedTextBox.xml: '.', hexadecimal value 0x00, is an invalid character. Line 1168, position 65.
Failed to load E:\apidrop\XMLDevDrop\feb-24-2017\System.Windows.Forms\TextBox.xml: '.', hexadecimal value 0x00, is an invalid character. Line 417, position 65.

Both files are generated out of the System.Windows.Forms.dll assembly in .NET Framework.

mdoc adds duplicated EII members to xml when update

Use mdoc 5.0.0.9 to run "mdoc update" with the dlls from below repo:
https://apidrop.visualstudio.com/_git/binaries?path=%2Fdotnet&version=GBmaster&_a=contents
against existing xmls from here:
https://github.com/TianqiZhang/ECMA2YamlTestRepo2/tree/withyml/fulldocset/xml
You'll find that many duplicated members were inserted into xml with exactly the same name, signature and DocId. Take fulldocset\xml\Microsoft.VisualBasic\Collection.xml as an example, after mdoc finishes update, you can find two "System.Collections.ICollection.CopyTo" members and a bunch of other duplicated members.

mdoc is setting <TypeParameter Name="?"> in xml

Today I found that from latest dotnet dlls, mdoc will generate xmls with in it, like:

<Member MemberName="CreateArray2D<?,T>">
      <MemberSignature Language="C#" Value="public static T[,] CreateArray2D<?,T> (System.Collections.Generic.IEnumerable<?> rows) where ? : System.Collections.Generic.IEnumerable<T>;" />
      <MemberSignature Language="ILAsm" Value=".method public static !!T[,] CreateArray2D<(class System.Collections.Generic.IEnumerable`1<!!T>) ?, T>(class System.Collections.Generic.IEnumerable`1<!!?> rows) cil managed" />
      <MemberSignature Language="DocId" Value="M:Microsoft.FSharp.Core.ExtraTopLevelOperators.CreateArray2D``2(System.Collections.Generic.IEnumerable{``0})" />
      <MemberType>Method</MemberType>
      <AssemblyInfo>
        <AssemblyName>FSharp.Core</AssemblyName>
        <AssemblyVersion>2.3.98.1</AssemblyVersion>
        <AssemblyVersion>3.98.4.0</AssemblyVersion>
        <AssemblyVersion>3.100.4.0</AssemblyVersion>
      </AssemblyInfo>
      <Attributes>
        <Attribute>
          <AttributeName>Microsoft.FSharp.Core.CompilationSourceName("array2D")</AttributeName>
        </Attribute>
      </Attributes>
      <ReturnValue>
        <ReturnType>T[,]</ReturnType>
      </ReturnValue>
      <TypeParameters>
        <TypeParameter Name="?">
          <Constraints>
            <InterfaceName>System.Collections.Generic.IEnumerable<T></InterfaceName>
          </Constraints>
        </TypeParameter>
        <TypeParameter Name="T" />
      </TypeParameters>
      <Parameters>
        <Parameter Name="rows" Type="System.Collections.Generic.IEnumerable<?>" />
      </Parameters>
      <Docs>
        <typeparam name="?">To be added.</typeparam>
        <typeparam name="T">To be added.</typeparam>
        <param name="rows">To be added.</param>
        <summary>To be added.</summary>
        <returns>To be added.</returns>
        <remarks>To be added.</remarks>
      </Docs>
    </Member>

[mdoc] Tool breaks when hitting System.Printing.IndexedProperties.PrintDateTimeProperty

Getting the following error:

mdoc: System.InvalidCastException: Unable to cast object of type 'Mono.Cecil.OptionalModifierType' to type 'Mono.Cecil.RequiredModifierType'.
   at Mono.Cecil.Rocks.DocCommentId.WriteTypeSignature(TypeReference type)
   at Mono.Cecil.Rocks.DocCommentId.WriteReturnType(MethodDefinition method)
   at Mono.Cecil.Rocks.DocCommentId.WriteMethod(MethodDefinition method)
   at Mono.Cecil.Rocks.DocCommentId.GetDocCommentId(IMemberDefinition member)
   at Mono.Documentation.FrameworkTypeEntry.ProcessMember(MemberReference member)
   at Mono.Documentation.MDocUpdater.UpdateMember(DocsNodeInfo info, FrameworkTypeEntry typeEntry)
   at Mono.Documentation.MDocUpdater.MakeMember(XmlDocument doc, DocsNodeInfo info, FrameworkTypeEntry typeEntry)
   at Mono.Documentation.MDocUpdater.DoUpdateType2(String message, XmlDocument basefile, TypeDefinition type, FrameworkTypeEntry typeEntry, String output, Boolean insertSince)
   at Mono.Documentation.MDocUpdater.StubType(TypeDefinition type, String output)
   at Mono.Documentation.MDocUpdater.DoUpdateType(TypeDefinition type, FrameworkTypeEntry typeEntry, String basepath, String dest)
   at Mono.Documentation.MDocUpdater.DoUpdateAssembly(AssemblySet assemblySet, AssemblyDefinition assembly, XmlElement index_types, String source, String dest, HashSet`1 goodfiles)
   at Mono.Documentation.MDocUpdater.DoUpdateAssemblies(String source, String dest)
   at Mono.Documentation.MDocUpdater.Run(IEnumerable`1 args)
   at Mono.Documentation.MDoc.Run(String[] args)
   at Mono.Documentation.MDoc.Main(String[] args)
See `mdoc help' for more information or use --debug to diagnose.

Related to:

New Type: System.Printing.IndexedProperties.PrintDateTimeProperty
Member Added: public PrintDateTimeProperty (string attributeName, object attributeValue);
Member Added: public PrintDateTimeProperty (string attributeName);

In System.Printing.dll.

mdoc can't handle different return types across different frameworks/monikers

This time it's when type parameter names are different in generic methods, like:

    <Member MemberName="System.Linq.IQueryProvider.Execute&lt;S&gt;">
      <MemberSignature Language="C#" Value="S IQueryProvider.Execute&lt;S&gt; (System.Linq.Expressions.Expression expression);" />
      <MemberSignature Language="ILAsm" Value=".method hidebysig newslot virtual instance !!S System.Linq.IQueryProvider.Execute&lt;S&gt;(class System.Linq.Expressions.Expression expression) cil managed" />
      <MemberSignature Language="DocId" Value="M:System.Data.Linq.Table`1.System#Linq#IQueryProvider#Execute``1(System.Linq.Expressions.Expression)" />
      <MemberType>Method</MemberType>
      <AssemblyInfo>
        <AssemblyName>System.Data.Linq</AssemblyName>
        <AssemblyVersion>4.0.0.0</AssemblyVersion>
      </AssemblyInfo>
      <ReturnValue>
        <ReturnType>S</ReturnType>
      </ReturnValue>
      <TypeParameters>
        <TypeParameter Name="S" />
      </TypeParameters>
      <Parameters>
        <Parameter Name="expression" Type="System.Linq.Expressions.Expression" />
      </Parameters>
      <Docs>
        <typeparam name="S">To be added.</typeparam>
        <param name="expression">To be added.</param>
        <summary>To be added.</summary>
        <returns>To be added.</returns>
        <remarks>To be added.</remarks>
      </Docs>
    </Member>
    <Member MemberName="System.Linq.IQueryProvider.Execute&lt;TResult&gt;">
      <MemberSignature Language="C#" Value="TResult IQueryProvider.Execute&lt;TResult&gt; (System.Linq.Expressions.Expression expression);" />
      <MemberSignature Language="ILAsm" Value=".method hidebysig newslot virtual instance !!TResult System.Linq.IQueryProvider.Execute&lt;TResult&gt;(class System.Linq.Expressions.Expression expression) cil managed" />
      <MemberSignature Language="DocId" Value="M:System.Data.Linq.Table`1.System#Linq#IQueryProvider#Execute``1(System.Linq.Expressions.Expression)" />
      <MemberType>Method</MemberType>
      <AssemblyInfo>
        <AssemblyName>System.Data.Linq</AssemblyName>
        <AssemblyVersion>4.0.0.0</AssemblyVersion>
      </AssemblyInfo>
      <ReturnValue>
        <ReturnType>TResult</ReturnType>
      </ReturnValue>
      <TypeParameters>
        <TypeParameter Name="TResult" />
      </TypeParameters>
      <Parameters>
        <Parameter Name="expression" Type="System.Linq.Expressions.Expression" />
      </Parameters>
      <Docs>
        <typeparam name="TResult">To be added.</typeparam>
        <param name="expression">To be added.</param>
        <summary>To be added.</summary>
        <returns>To be added.</returns>
        <remarks>To be added.</remarks>
      </Docs>
    </Member>

How to repro:
Clone this repo and run mdoc against dotnet folder. Above example will be generated in System.Data.Linq/Table`1.xml

[mdoc] Error updating a generic extension method

If you've got an assembly with an extension method that looks like this

    public static class ArrayX10 {
        public static bool IsAligned<T> (this T[] vect, int index) where T : struct 
        {
            return false;
        }
    }

You will receive the following error with mdoc update

mdoc: System.ArgumentNullException: Value cannot be null.
Parameter name: member
  at Mono.Documentation.MemberFormatter.GetDeclaration (Mono.Cecil.IMemberDefinition member) [0x00006] in <bdba0d7bb95b4ee498bb485f1da6983a>:0 
  at Mono.Documentation.MemberFormatter.GetDeclaration (Mono.Cecil.MemberReference mreference) [0x00007] in <bdba0d7bb95b4ee498bb485f1da6983a>:0 
  at Mono.Documentation.MDocUpdater.AddTargets (System.Xml.XmlNode member, Mono.Documentation.DocsNodeInfo info) [0x00055] in <bdba0d7bb95b4ee498bb485f1da6983a>:0 
  at Mono.Documentation.MDocUpdater.UpdateExtensionMethods (System.Xml.XmlElement e, Mono.Documentation.DocsNodeInfo info) [0x000d8] in <bdba0d7bb95b4ee498bb485f1da6983a>:0 
  at Mono.Documentation.MDocUpdater.UpdateMember (Mono.Documentation.DocsNodeInfo info) [0x0024b] in <bdba0d7bb95b4ee498bb485f1da6983a>:0 
  at Mono.Documentation.MDocUpdater.MakeMember (System.Xml.XmlDocument doc, Mono.Documentation.DocsNodeInfo info) [0x000c1] in <bdba0d7bb95b4ee498bb485f1da6983a>:0 
  at Mono.Documentation.MDocUpdater.DoUpdateType2 (System.String message, System.Xml.XmlDocument basefile, Mono.Cecil.TypeDefinition type, System.String output, System.Boolean insertSince) [0x00376] in <bdba0d7bb95b4ee498bb485f1da6983a>:0 
  at Mono.Documentation.MDocUpdater.StubType (Mono.Cecil.TypeDefinition type, System.String output) [0x00030] in <bdba0d7bb95b4ee498bb485f1da6983a>:0 
  at Mono.Documentation.MDocUpdater.DoUpdateType (Mono.Cecil.TypeDefinition type, System.String basepath, System.String dest) [0x001d9] in <bdba0d7bb95b4ee498bb485f1da6983a>:0 
  at Mono.Documentation.MDocUpdater.DoUpdateAssembly (Mono.Cecil.AssemblyDefinition assembly, System.Xml.XmlElement index_types, System.String source, System.String dest, System.Collections.Generic.HashSet`1[T] goodfiles) [0x0005d] in <bdba0d7bb95b4ee498bb485f1da6983a>:0 
  at Mono.Documentation.MDocUpdater.DoUpdateAssemblies (System.String source, System.String dest) [0x00125] in <bdba0d7bb95b4ee498bb485f1da6983a>:0 
  at Mono.Documentation.MDocUpdater.Run (System.Collections.Generic.IEnumerable`1[T] args) [0x00404] in <bdba0d7bb95b4ee498bb485f1da6983a>:0 
  at Mono.Documentation.MDoc.Run (System.String[] args) [0x001f6] in <bdba0d7bb95b4ee498bb485f1da6983a>:0 
  at Mono.Documentation.MDoc.Main (System.String[] args) [0x00006] in <bdba0d7bb95b4ee498bb485f1da6983a>:0 
See `mdoc help' for more information or use --debug to diagnose.

[mdoc] Support for pulling all DLLs from a folder natively

Currently, mdoc on Windows does not support pulling DLLs from the entire folder (given that PS and BATCH do not support *.dll).

Would be good to have a custom parameter (e.g. --scanfolder FOLDER_PATH) that will enable pulling all DLLs from folder and its subfolders.

[mdoc] Support for F#, VB and C++ signatures

Currently mdoc does not support F#, VB and C++ signatures for types. It would be helpful to have those, as soon we will enable automated documentation generation from ref sources.

[mdoc][release 5.0.0.2] Cannot find file on reflecting multiple frameworks

I have the following set of assemblies to reflect from:

capture

I then get the following error, when I try to run mdoc with the -frameworks parameter that points to the source folder:

mdoc: System.IO.FileNotFoundException: Could not find file 'C:\Users\dendeli\Downloads\DLLs\netframework-2.0\System.EnterpriseServices.Wrapper.dll'.
File name: 'C:\Users\dendeli\Downloads\DLLs\netframework-2.0\System.EnterpriseServices.Wrapper.dll'
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
   at Mono.Cecil.ModuleDefinition.ReadModule(String fileName, ReaderParameters parameters)
   at Mono.Cecil.MetadataReader.ReadModules()
   at Mono.Cecil.AssemblyDefinition.<get_Modules>m__0(AssemblyDefinition _, MetadataReader reader)
   at Mono.Cecil.ModuleDefinition.Read[TItem,TRet](TRet& variable, TItem item, Func`3 read)
   at Mono.Cecil.AssemblyDefinition.get_Modules()
   at Mono.Documentation.CecilExtensions.GetTypes(AssemblyDefinition assembly)
   at Mono.Documentation.DocumentationEnumerator.<GetDocumentationTypes>c__Iterator0.MoveNext()
   at Mono.Documentation.MDocUpdater.DoUpdateAssembly(AssemblyDefinition assembly, XmlElement index_types, String source, String dest, HashSet`1 goodfiles)
   at Mono.Documentation.MDocUpdater.DoUpdateAssemblies(String source, String dest)
   at Mono.Documentation.MDocUpdater.Run(IEnumerable`1 args)
   at Mono.Documentation.MDoc.Run(String[] args)
   at Mono.Documentation.MDoc.Main(String[] args)
See `mdoc help' for more information or use --debug to diagnose.

[mdoc] Reflected enums don't get their numeric value in the XML

Currently, ECMAXML does not contain the number values for enums. As an example, let’s say we have RadioButtonState.

In the XML, we just get the member names:

<Type Name="RadioButtonState" FullName="System.Windows.Forms.VisualStyles.RadioButtonState">
  <TypeSignature Language="C#" Value="public enum RadioButtonState" />
  <TypeSignature Language="ILAsm" Value=".class public auto ansi sealed RadioButtonState extends System.Enum" />
  <AssemblyInfo>
    <AssemblyName>System.Windows.Forms</AssemblyName>
    <AssemblyVersion>2.0.0.0</AssemblyVersion>
    <AssemblyVersion>4.0.0.0</AssemblyVersion>
  </AssemblyInfo>
  <Base>
    <BaseTypeName>System.Enum</BaseTypeName>
  </Base>
  <Docs>
    <summary>To be added.</summary>
    <remarks>To be added.</remarks>
  </Docs>
  <Members>
    <Member MemberName="CheckedDisabled">
      <MemberSignature Language="C#" Value="CheckedDisabled" />
      <MemberSignature Language="ILAsm" Value=".field public static literal valuetype System.Windows.Forms.VisualStyles.RadioButtonState CheckedDisabled = int32(8)" />
      <MemberType>Field</MemberType>
      <AssemblyInfo>
        <AssemblyVersion>2.0.0.0</AssemblyVersion>
        <AssemblyVersion>4.0.0.0</AssemblyVersion>
      </AssemblyInfo>
      <ReturnValue>
        <ReturnType>System.Windows.Forms.VisualStyles.RadioButtonState</ReturnType>
      </ReturnValue>
      <Docs>
        <summary>To be added.</summary>
      </Docs>
    </Member>
    <Member MemberName="CheckedHot">
      <MemberSignature Language="C#" Value="CheckedHot" />
      <MemberSignature Language="ILAsm" Value=".field public static literal valuetype System.Windows.Forms.VisualStyles.RadioButtonState CheckedHot = int32(6)" />
      <MemberType>Field</MemberType>
      <AssemblyInfo>
        <AssemblyVersion>2.0.0.0</AssemblyVersion>
        <AssemblyVersion>4.0.0.0</AssemblyVersion>
      </AssemblyInfo>
      <ReturnValue>
        <ReturnType>System.Windows.Forms.VisualStyles.RadioButtonState</ReturnType>
      </ReturnValue>
      <Docs>
        <summary>To be added.</summary>
      </Docs>
    </Member>
    <Member MemberName="CheckedNormal">
      <MemberSignature Language="C#" Value="CheckedNormal" />
      <MemberSignature Language="ILAsm" Value=".field public static literal valuetype System.Windows.Forms.VisualStyles.RadioButtonState CheckedNormal = int32(5)" />
      <MemberType>Field</MemberType>
      <AssemblyInfo>
        <AssemblyVersion>2.0.0.0</AssemblyVersion>
        <AssemblyVersion>4.0.0.0</AssemblyVersion>
      </AssemblyInfo>
      <ReturnValue>
        <ReturnType>System.Windows.Forms.VisualStyles.RadioButtonState</ReturnType>
      </ReturnValue>
      <Docs>
        <summary>To be added.</summary>
      </Docs>
    </Member>
    <Member MemberName="CheckedPressed">
      <MemberSignature Language="C#" Value="CheckedPressed" />
      <MemberSignature Language="ILAsm" Value=".field public static literal valuetype System.Windows.Forms.VisualStyles.RadioButtonState CheckedPressed = int32(7)" />
      <MemberType>Field</MemberType>
      <AssemblyInfo>
        <AssemblyVersion>2.0.0.0</AssemblyVersion>
        <AssemblyVersion>4.0.0.0</AssemblyVersion>
      </AssemblyInfo>
      <ReturnValue>
        <ReturnType>System.Windows.Forms.VisualStyles.RadioButtonState</ReturnType>
      </ReturnValue>
      <Docs>
        <summary>To be added.</summary>
      </Docs>
    </Member>
    <Member MemberName="UncheckedDisabled">
      <MemberSignature Language="C#" Value="UncheckedDisabled" />
      <MemberSignature Language="ILAsm" Value=".field public static literal valuetype System.Windows.Forms.VisualStyles.RadioButtonState UncheckedDisabled = int32(4)" />
      <MemberType>Field</MemberType>
      <AssemblyInfo>
        <AssemblyVersion>2.0.0.0</AssemblyVersion>
        <AssemblyVersion>4.0.0.0</AssemblyVersion>
      </AssemblyInfo>
      <ReturnValue>
        <ReturnType>System.Windows.Forms.VisualStyles.RadioButtonState</ReturnType>
      </ReturnValue>
      <Docs>
        <summary>To be added.</summary>
      </Docs>
    </Member>
    <Member MemberName="UncheckedHot">
      <MemberSignature Language="C#" Value="UncheckedHot" />
      <MemberSignature Language="ILAsm" Value=".field public static literal valuetype System.Windows.Forms.VisualStyles.RadioButtonState UncheckedHot = int32(2)" />
      <MemberType>Field</MemberType>
      <AssemblyInfo>
        <AssemblyVersion>2.0.0.0</AssemblyVersion>
        <AssemblyVersion>4.0.0.0</AssemblyVersion>
      </AssemblyInfo>
      <ReturnValue>
        <ReturnType>System.Windows.Forms.VisualStyles.RadioButtonState</ReturnType>
      </ReturnValue>
      <Docs>
        <summary>To be added.</summary>
      </Docs>
    </Member>
    <Member MemberName="UncheckedNormal">
      <MemberSignature Language="C#" Value="UncheckedNormal" />
      <MemberSignature Language="ILAsm" Value=".field public static literal valuetype System.Windows.Forms.VisualStyles.RadioButtonState UncheckedNormal = int32(1)" />
      <MemberType>Field</MemberType>
      <AssemblyInfo>
        <AssemblyVersion>2.0.0.0</AssemblyVersion>
        <AssemblyVersion>4.0.0.0</AssemblyVersion>
      </AssemblyInfo>
      <ReturnValue>
        <ReturnType>System.Windows.Forms.VisualStyles.RadioButtonState</ReturnType>
      </ReturnValue>
      <Docs>
        <summary>To be added.</summary>
      </Docs>
    </Member>
    <Member MemberName="UncheckedPressed">
      <MemberSignature Language="C#" Value="UncheckedPressed" />
      <MemberSignature Language="ILAsm" Value=".field public static literal valuetype System.Windows.Forms.VisualStyles.RadioButtonState UncheckedPressed = int32(3)" />
      <MemberType>Field</MemberType>
      <AssemblyInfo>
        <AssemblyVersion>2.0.0.0</AssemblyVersion>
        <AssemblyVersion>4.0.0.0</AssemblyVersion>
      </AssemblyInfo>
      <ReturnValue>
        <ReturnType>System.Windows.Forms.VisualStyles.RadioButtonState</ReturnType>
      </ReturnValue>
      <Docs>
        <summary>To be added.</summary>
      </Docs>
    </Member>
  </Members>
</Type>

If we look at the reference source, you will notice that there are individual values assigned to each enum entry:

[
        SuppressMessage("Microsoft.Design", "CA1008:EnumsShouldHaveZeroValue")
    ]
    public enum RadioButtonState {
        /// <include file='doc\VisualStyleStates.uex' path='docs/doc[@for="RadioButtonState.UncheckedNormal"]/*' />
        UncheckedNormal = 1, 
        /// <include file='doc\VisualStyleStates.uex' path='docs/doc[@for="RadioButtonState.UncheckedHot"]/*' />
        UncheckedHot = 2, 
        /// <include file='doc\VisualStyleStates.uex' path='docs/doc[@for="RadioButtonState.UncheckedPressed"]/*' />
        UncheckedPressed = 3, 
        /// <include file='doc\VisualStyleStates.uex' path='docs/doc[@for="RadioButtonState.UncheckedDisabled"]/*' />
        UncheckedDisabled = 4, 
        /// <include file='doc\VisualStyleStates.uex' path='docs/doc[@for="RadioButtonState.CheckedNormal"]/*' />
        CheckedNormal = 5, 
        /// <include file='doc\VisualStyleStates.uex' path='docs/doc[@for="RadioButtonState.CheckedHot"]/*' />
        CheckedHot = 6, 
        /// <include file='doc\VisualStyleStates.uex' path='docs/doc[@for="RadioButtonState.CheckedPressed"]/*' />
        CheckedPressed = 7, 
        /// <include file='doc\VisualStyleStates.uex' path='docs/doc[@for="RadioButtonState.CheckedDisabled"]/*' />
        CheckedDisabled = 8
    } 

ref/out parameters aren't properly linked

This is the member:

float MeasureText(String, ref SKRect);
MeasureText(String, ref SKRect) : Single

in this section:
https://developer.xamarin.com/api/type/SkiaSharp.SKPaint/#Public_Methods

This is the mdoc:

<Parameter Name="bounds" Type="SkiaSharp.SKRect&amp;" RefType="ref" />

in this file:
https://github.com/mono/SkiaSharp/blob/master/docs/en/SkiaSharp/SKPaint.xml#L1068-L1096

And this is the generated link:

https://developer.xamarin.com/api/member/SkiaSharp.SKPaint.MeasureText/p/System.String/SkiaSharp.SKRect@/

Note the @. If I change it to a &:

https://developer.xamarin.com/api/member/SkiaSharp.SKPaint.MeasureText/p/System.String/SkiaSharp.SKRect&/

Then it works.

[mdoc] Add `MemberGroup` to XSD

Per #17, the Members/MemberGroup node will be used to hold documentation that pertains to an entire set of overloaded methods. This task is to add it to the XSD.

The MemberGroup will look like this:

<Members>
    <MemberGroup Name="foo">...</MemberGroup>
    <Member Name="foo">...</Member>
    <Member Name="foo">...</Member>
</Members>

Elements that are valid inside of MemberGroup include

  • summary
  • remarks
  • AssemblyInfo

You can see an example of an overload summary page here: System.String.Compare on MSDN

mdoc is inserting invalid parameter type name

In the xml generated for .Net class System.Printing.IndexedProperties.PrintTicketProperty, you can see below member:

<Member MemberName="op_Implicit">
      <MemberSignature Language="C#" Value="public static System.Printing.PrintTicket op_Implicit (System.Printing.IndexedProperties.PrintTicketProperty modreq(System.Runtime.CompilerServices.IsImplicitlyDereferenced) attribRef);" />
      <MemberSignature Language="ILAsm" Value=".method public static hidebysig specialname class System.Printing.PrintTicket op_Implicit(class System.Printing.IndexedProperties.PrintTicketProperty modreq(System.Runtime.CompilerServices.IsImplicitlyDereferenced) attribRef) cil managed" />
      <MemberSignature Language="DocId" Value="M:System.Printing.IndexedProperties.PrintTicketProperty.op_Implicit(System.Printing.IndexedProperties.PrintTicketProperty|System.Runtime.CompilerServices.IsImplicitlyDereferenced)~System.Printing.PrintTicket" />
      <MemberType>Method</MemberType>
      <AssemblyInfo>
        <AssemblyName>System.Printing</AssemblyName>
        <AssemblyVersion>4.0.0.0</AssemblyVersion>
      </AssemblyInfo>
      <Attributes>
        <Attribute>
          <AttributeName>System.Security.SecuritySafeCritical</AttributeName>
        </Attribute>
      </Attributes>
      <ReturnValue>
        <ReturnType>System.Printing.PrintTicket</ReturnType>
      </ReturnValue>
      <Parameters>
        <Parameter Name="attribRef" Type="System.Printing.IndexedProperties.PrintTicketProperty modreq(System.Runtime.CompilerServices.IsImplicitlyDereferenced)" />
      </Parameters>
      <Docs>
        <param name="attribRef">To be added.</param>
        <summary>To be added.</summary>
        <returns>To be added.</returns>
        <remarks>To be added.</remarks>
      </Docs>
    </Member>

Not the <Parameter Name="attribRef" Type="System.Printing.IndexedProperties.PrintTicketProperty modreq(System.Runtime.CompilerServices.IsImplicitlyDereferenced)" />, it's not a valid type string

[mdoc] Group overloads and allow information related to all of them

One of the scenarios that we are encountering is the need to associate certain information with all overloads of a member. For example:

https://msdn.microsoft.com/en-us/library/system.string.compare(v=vs.110).aspx

Notice that there is a description associated with the set of overloads. This is something that is not possible today in ECMAXML as it does not allow descriptions for member sets, or even the grouping of members.

The ask is to allow member grouping per-name (e.g. find overloads of a method) and then allow information to be presented within that group.

[mdoc] Some types are missing if I run a lot of dlls together

Not sure if you’ve noticed, when running mdoc against all dlls of .Net 4.6.2, some types are not saved into xml file. I used this folder: \fxcore\Platforms\ApiCatalog.NET Framework 4.6.2 and copied *.dll to another folder.

For example, if you run “mdoc update -o xmlFolder mscorlib.dll”, you’ll get 22 xml files under System.Collections.Generic folder. However if you use the command from run.sh.txt to run against all dlls, you get only 20 xml files in the same folder. From below image you can see the two lists of files are almost entirely different:
typesmissing

[mdoc] Error when updating on a .NET Core assembly

In the currently released version of mdoc, you receive the following error when you try to mdoc update a .NET Core assembly:

$ mdoc update --debug bin/Debug/netcoreapp1.0/dnnew.dll -o en -L /usr/local/share/dotnet/shared/Microsoft.NETCore.App/1.0.0-rc2-3002702/
mdoc: System.NotSupportedException: Specified method is not supported.
  at Mono.Cecil.PE.ImageReader.ReadArchitecture () [0x00040] in <6f5dcfb43b83409e9bb6016a08899100>:0 
  at Mono.Cecil.PE.ImageReader.ReadImage () [0x0005c] in <6f5dcfb43b83409e9bb6016a08899100>:0 
  at Mono.Cecil.PE.ImageReader.ReadImage (Mono.Disposable`1[T] stream, System.String file_name) [0x00008] in <6f5dcfb43b83409e9bb6016a08899100>:0 
  at Mono.Cecil.ModuleDefinition.ReadModule (Mono.Disposable`1[T] stream, System.String fileName, Mono.Cecil.ReaderParameters parameters) [0x00006] in <6f5dcfb43b83409e9bb6016a08899100>:0 
  at Mono.Cecil.ModuleDefinition.ReadModule (System.String fileName, Mono.Cecil.ReaderParameters parameters) [0x0006f] in <6f5dcfb43b83409e9bb6016a08899100>:0 

It looks like we should be able to work around this with a newer version of Mono.Cecil (or will be soon as they are obviously still adding some facilities like a default AssemblyResolver for .net core).

[mdoc][feature-request] Ability to reflect from *.winmd files

Currently, if I change the extension of a *.winmd file to *.dll, I will get this error:

mdoc: System.NotSupportedException: Version not supported: 255.255.255.255
   at Mono.Cecil.BaseAssemblyResolver.GetCorlib(AssemblyNameReference reference, ReaderParameters parameters)
   at Mono.Cecil.BaseAssemblyResolver.Resolve(AssemblyNameReference name, ReaderParameters parameters)
   at Mono.Cecil.DefaultAssemblyResolver.Resolve(AssemblyNameReference name)
   at Mono.Cecil.MetadataResolver.Resolve(TypeReference type)
   at Mono.Cecil.TypeReference.Resolve()
   at Mono.Documentation.DocUtils.GetInheritedInterfaces(TypeDefinition type)
   at Mono.Documentation.DocUtils.GetUserImplementedInterfaces(TypeDefinition type)
   at Mono.Documentation.CSharpFullMemberFormatter.GetTypeDeclaration(TypeDefinition type)
   at Mono.Documentation.MemberFormatter.GetDeclaration(IMemberDefinition member)
   at Mono.Documentation.MemberFormatter.GetDeclaration(MemberReference mreference)
   at Mono.Documentation.MDocUpdater.StubType(TypeDefinition type, String output)
   at Mono.Documentation.MDocUpdater.DoUpdateType(TypeDefinition type, FrameworkTypeEntry typeEntry, String basepath, String dest)
   at Mono.Documentation.MDocUpdater.DoUpdateAssembly(AssemblyDefinition assembly, XmlElement index_types, String source, String dest, HashSet`1 goodfiles)
   at Mono.Documentation.MDocUpdater.DoUpdateAssemblies(String source, String dest)
   at Mono.Documentation.MDocUpdater.Run(IEnumerable`1 args)
   at Mono.Documentation.MDoc.Run(String[] args)
   at Mono.Documentation.MDoc.Main(String[] args)
See `mdoc help' for more information or use --debug to diagnose.

*.winmd is an ECMA 335 assembly so should work the same way as any other managed DLL.

[mdoc][release 5.0.0.2] Error when reflecting from XamlBuildTypeInspectionExtensionContext

Getting the following error:

Updating: Microsoft.Build.Tasks.Xaml.XamlBuildTypeGenerationExtensionContext
Updating: Microsoft.Build.Tasks.Xaml.XamlBuildTypeInspectionExtensionContext
mdoc: System.InvalidOperationException: Failed to compare two elements in the array. ---> System.InvalidOperationException: Duplicate extension method found!
   at Mono.Documentation.MDocUpdater.ExtensionMethodComparer.Compare(XmlNode x, XmlNode y)
   at System.Collections.Generic.ArraySortHelper`1.PickPivotAndPartition(T[] keys, Int32 lo, Int32 hi, IComparer`1 comparer)
   at System.Collections.Generic.ArraySortHelper`1.IntroSort(T[] keys, Int32 lo, Int32 hi, Int32 depthLimit, IComparer`1 comparer)
   at System.Collections.Generic.ArraySortHelper`1.IntrospectiveSort(T[] keys, Int32 left, Int32 length, IComparer`1 comparer)
   at System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer)
   --- End of inner exception stack trace ---
   at System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer)
   at System.Array.Sort[T](T[] array, Int32 index, Int32 length, IComparer`1 comparer)
   at System.Collections.Generic.List`1.Sort(Int32 index, Int32 count, IComparer`1 comparer)
   at Mono.Documentation.MDocUpdater.CleanupExtensions(XmlElement index_types)
   at Mono.Documentation.MDocUpdater.DoUpdateAssemblies(String source, String dest)
   at Mono.Documentation.MDocUpdater.Run(IEnumerable`1 args)
   at Mono.Documentation.MDoc.Run(String[] args)
   at Mono.Documentation.MDoc.Main(String[] args)
See `mdoc help' for more information or use --debug to diagnose.

This is caused by Microsoft.Build.Tasks.Xaml.XamlBuildTypeGenerationExtensionContext, part of XamlBuildTask.dll.

[monodoc] New Project File

Currently, the existing project file is made to work only in the context of the mono build/makefile. As such, it can't be opened/tested/debugged in a local IDE.

A project and solution file should be created for local development.

[mdoc] Microsoft.VisualBasic.Compatibility.Data.dll breaks the tool

When running mdoc on Microsoft.VisualBasic.Compatibility.Data.dll (in C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0), the tool errors out with:

mdoc: Mono.Cecil.AssemblyResolutionException: Failed to resolve assembly: 'MSDATASRC, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
  at Mono.Cecil.BaseAssemblyResolver.Resolve (Mono.Cecil.AssemblyNameReference name, Mono.Cecil.ReaderParameters parameters) [0x00121] in <364321ccd6674266bec9cd4fab3f2d34>:0
  at Mono.Cecil.BaseAssemblyResolver.Resolve (Mono.Cecil.AssemblyNameReference name) [0x00007] in <364321ccd6674266bec9cd4fab3f2d34>:0
  at Mono.Cecil.DefaultAssemblyResolver.Resolve (Mono.Cecil.AssemblyNameReference name) [0x0002b] in <364321ccd6674266bec9cd4fab3f2d34>:0
  at Mono.Cecil.MetadataResolver.Resolve (Mono.Cecil.TypeReference type) [0x00040] in <364321ccd6674266bec9cd4fab3f2d34>:0
  at Mono.Cecil.ModuleDefinition.Resolve (Mono.Cecil.TypeReference type) [0x00006] in <364321ccd6674266bec9cd4fab3f2d34>:0
  at Mono.Cecil.TypeReference.Resolve () [0x00013] in <364321ccd6674266bec9cd4fab3f2d34>:0
  at Mono.Documentation.DocUtils.GetInheritedInterfaces (Mono.Cecil.TypeDefinition type) [0x0007d] in <ffc07159c23e4de8b7c8063bdf9582a3>:0
  at Mono.Documentation.DocUtils.GetUserImplementedInterfaces (Mono.Cecil.TypeDefinition type) [0x00000] in <ffc07159c23e4de8b7c8063bdf9582a3>:0
  at Mono.Documentation.CSharpFullMemberFormatter.GetTypeDeclaration (Mono.Cecil.TypeDefinition type) [0x001a9] in <ffc07159c23e4de8b7c8063bdf9582a3>:0
  at Mono.Documentation.MemberFormatter.GetDeclaration (Mono.Cecil.MemberReference member) [0x0001e] in <ffc07159c23e4de8b7c8063bdf9582a3>:0
  at Mono.Documentation.MDocUpdater.StubType (Mono.Cecil.TypeDefinition type, System.String output) [0x00000] in <ffc07159c23e4de8b7c8063bdf9582a3>:0
  at Mono.Documentation.MDocUpdater.DoUpdateType (Mono.Cecil.TypeDefinition type, System.String basepath, System.String dest) [0x001d9] in <ffc07159c23e4de8b7c8063bdf9582a3>:0
  at Mono.Documentation.MDocUpdater.DoUpdateAssembly (Mono.Cecil.AssemblyDefinition assembly, System.Xml.XmlElement index_types, System.String source, System.String dest, System.Collections.Generic.HashSet`1[T] goodfiles) [0x0005d] in <ffc07159c23e4de8b7c8063bdf9582a3>:0
  at Mono.Documentation.MDocUpdater.DoUpdateAssemblies (System.String source, System.String dest) [0x00125] in <ffc07159c23e4de8b7c8063bdf9582a3>:0
  at Mono.Documentation.MDocUpdater.Run (System.Collections.Generic.IEnumerable`1[T] args) [0x00421] in <ffc07159c23e4de8b7c8063bdf9582a3>:0
  at Mono.Documentation.MDoc.Run (System.String[] args) [0x001f6] in <ffc07159c23e4de8b7c8063bdf9582a3>:0
  at Mono.Documentation.MDoc.Main (System.String[] args) [0x00006] in <ffc07159c23e4de8b7c8063bdf9582a3>:0

[mdoc] Generate long-form identifiers

Today, mdoc does not generate long-form identifiers (e.g. T:System.Data.DataRow) for namespaces/types/members with the exception of index.xml where it references those in ExtensionMethods:

<ExtensionMethod>
      <Targets>
        <Target Type="T:System.Data.DataRow" />
      </Targets>
      <Member MemberName="SetField&lt;T&gt;">
        <MemberSignature Language="C#" Value="public static void SetField&lt;T&gt; (this System.Data.DataRow row, System.Data.DataColumn column, T value);" />
        <MemberSignature Language="ILAsm" Value=".method public static hidebysig void SetField&lt;T&gt;(class System.Data.DataRow row, class System.Data.DataColumn column, !!T value) cil managed" />
        <MemberType>ExtensionMethod</MemberType>

Add support for a Markdown <format> option

In our publishing system, we have a lot of Markdown content that we are exposing to end-users. To embed it in ECMA XML, we use <format type="text/markdown"> and then the publishing system interprets it as such.

While this works for our needs, this is a larger ask for the Xamarin toolset to support interpreting Markdown from the <format> element for things such as mdoc export-html.

[mdoc] Support different platform variants and versions

mdoc does a good job detecting assembly versions, but those are not always representative of the platform variant and the platform version itself. So, say, .NET Framework 4.0 and 4.5 will both have mscorlib.dll at version 4.0 - we need to be able to specify the variant and version during mdoc run.

As an example of the proposal:

mdoc update *.dll -o TestFolder --platform netfx --platformversion 4.0

mdoc is generating C# syntax for C++ only types

For example, This class is C++ only and does not have C# syntax, however in mdoc we still see below signature:

<Type Name="ReverseBidirectionalIterator&lt;TValue&gt;" FullName="Microsoft.VisualC.StlClr.Generic.ReverseBidirectionalIterator&lt;TValue&gt;">
  <TypeSignature Language="C#" Value="public class ReverseBidirectionalIterator&lt;TValue&gt; : Microsoft.VisualC.StlClr.Generic.IBidirectionalIterator&lt;TValue&gt;" />

Similar issues were found for VisualBasic too.

[mdoc] some extension methods listed in index.xml is not found in their type

ExtensionMethod M:System.Linq.ImmutableArrayExtensions.LastOrDefault``1(System.Collections.Immutable.ImmutableArray{``0}.Builder) not found in its type System.Linq.ImmutableArrayExtensions
ExtensionMethod M:System.Linq.ImmutableArrayExtensions.Last``1(System.Collections.Immutable.ImmutableArray{``0}.Builder) not found in its type System.Linq.ImmutableArrayExtensions
 ExtensionMethod M:System.Linq.ImmutableArrayExtensions.FirstOrDefault``1(System.Collections.Immutable.ImmutableArray{``0}.Builder) not found in its type System.Linq.ImmutableArrayExtensions
ExtensionMethod M:System.Linq.ImmutableArrayExtensions.First``1(System.Collections.Immutable.ImmutableArray{``0}.Builder) not found in its type System.Linq.ImmutableArrayExtensions
ExtensionMethod M:System.Linq.ImmutableArrayExtensions.Any``1(System.Collections.Immutable.ImmutableArray{``0}.Builder) not found in its type System.Linq.ImmutableArrayExtensions

mdoc performance needs to improve in framework mode

It takes 2~3 hours for mdoc to generate xmls for 21 frameworks of .Net on my i7+SSD devbox. During this time, mdoc keeps doing disk IO. I assume if mdoc can do all the updates in memory and write xml files only once in the end, the performance could be improved greatly.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.