Pergunta

Visual Studio faz isso; Refletor faz isso; e agora eu quero também:)

Eu quero recuperar a documentação XML para alguns membros em algumas assembleias-quadro (ou seja mscorlib.dll, System.dll, etc). Suponho que isso envolveria:

  • encontrar o arquivo XML para a montagem,
  • navegar para o elemento filho apropriadamente chamado, e
  • recuperar os itens desejados (<summary>, <remarks>, etc)


Onde estão os arquivos XML mantidos para montagens de estrutura? Quaisquer pontos em decifrar o esquema de nomenclatura xmldoc? Existem quaisquer bibliotecas lá fora, que irá facilitar esse processo?

Foi útil?

Solução

Encontre xml

Para assembly.dll é nomeado como assembly.xml, mas instalado por Framework SDK, a própria Runtime não contém arquivos .xml. Os usuários não precisam documentação da API.

Localização é um pouco mais complexa. Ele pode estar lado a lado com a dll, no subdiretório nomeado após localidade corrente (por exemplo C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ en) ou mesmo em algum diretório estranho nas proximidades. Eu sugeriria procurá-lo na forma como os olhares de tempo de execução para conjuntos de satélite.

Encontre elemento

Para saber elemento, você deve preparar o chamado "ID xml-doc" a partir dos metadados. AFAIR é documentado em C especificação # linguagem, e um pouco no MSDN. Consulte Processamento de documentação XML .

Outras dicas

Com base de Ilya resposta :

Encontre xml

.NET fallback locais (ignorando GAC e outros subdiretórios irrelevantes)

static FileInfo GetXmlDocFile( Assembly assembly ) {
  string assemblyDirPath = Path.GetDirectoryName( assembly.Location );
  string fileName = Path.GetFileNameWithoutExtension( assembly.Location ) +".xml";

  return GetFallbackDirectories( CultureInfo.CurrentCulture )
    .Select( dirName => CombinePath( assemblyDirPath, dirName, fileName ) )
    .Select( filePath => new FileInfo( filePath ) )
    .Where( file => file.Exists )
    .First( );
}

static IEnumerable<string> GetFallbackDirectories( CultureInfo culture ) {
  return culture
    .Enumerate( c => c.Parent.Name != c.Name ? c.Parent : null )
    .Select( c => c.Name );
}

static IEnumerable<T> Enumerate<T>( this T start, Func<T, T> next ) {
  for( T item = start; !object.Equals( item, default(T) ); item = next( item ) )
    yield return item;
}

static string CombinePath( params string[] args ) {
  return args.Aggregate( Path.Combine );
}

Encontre elemento

Processamento de Documentação XML

static XElement GetDocMember( XElement docMembers, MemberInfo member ) {
  string memberId = GetMemberId( member );
  return docMembers.Elements( "member" )
    .Where( e => e.Attribute( "name" ).Value == memberId )
    .First( );
}

static string GetMemberId( MemberInfo member ) {
  char memberKindPrefix = GetMemberPrefix( member );
  string memberName = GetMemberFullName( member );
  return memberKindPrefix + ":" + memberName;
}

static char GetMemberPrefix( MemberInfo member ) {
  return member.GetType( ).Name
    .Replace( "Runtime", "" )[0];
}

static string GetMemberFullName( MemberInfo member ) {
  string memberScope = "";
  if( member.DeclaringType != null )
    memberScope = GetMemberFullName( member.DeclaringType );
  else if( member is Type )
    memberScope = ((Type)member).Namespace;

  return memberScope + "." + member.Name;
}

Exemplo utilização

Type type = typeof( string );

var file = GetXmlDocFile( type.Assembly );
var docXml = XDocument.Load( file.FullName );
var docMembers = docXml.Root.Element( "members" );

var member = type.GetProperty( "Length" );
var docMember = GetDocMember( docMembers, member );

I manter o projeto Jolt.NET no CodePlex e implementaram um recurso que executa esta tarefa. Consulte a biblioteca Jolt para obter mais informações.

Em essência, a biblioteca permite localizar programaticamente e consulta um arquivo doc comentários XML para uma montagem usando os tipos de metadados em System.Reflection (ou seja MethodInfo, PropertyInfo, etc ...).

Tente DocsByReflection .

// From method.
var methodInfo = typeof(Stub).GetMethod("MethodWithGenericParameter");
var methodDoc = DocsService.GetXmlFromMember(methodInfo);

Aqui está uma biblioteca de ready-made que irá permitir que você faça exatamente isso: NuDoc http://kzu.to/nudoc

A leitura da documentação toda em mscorlib por exemplo, seria tão simples como:

var members = Reader.Read(typeof(string).Assembly);

E mais tarde você pode processar os resultados usando um visitante simples, como mostrado no site.

Eu estou no processo de alavancar essa biblioteca para gerar um site de API usando remarcação para hospedagem no GitHub, o ideal é automaticamente em cada compilação, e talvez até mesmo para o wiki para que ele possa atualizado e round-tropeçou ao código :) .

O arquivo XML é nomeado exatamente como o arquivo do assembly, exceto para a extensão diferente 'xml' e deve estar localizado no mesmo diretório como a montagem em si.

Não é possível ajudá-lo com as outras duas questões, no entanto. AFAIK, você está no seu próprio ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top