3

Visual Studio がそれを行います。リフレクターがそれを行います。そして今、私もそうしたい:)

一部のフレームワーク アセンブリ ( 、 など) の一部のメンバーの XML ドキュメントを取得したいと考えていmscorlib.dllますSystem.dll。これには次のことが含まれると思います。

  • アセンブリの XML ファイルを検索し、
  • 適切な名前の子要素に移動し、
  • 目的のアイテムの取得 ( <summary><remarks>など)


フレームワーク アセンブリの XML ファイルはどこに保存されますか? XMLDOC 命名スキームを解読する際のポイントはありますか? このプロセスを簡単にするライブラリはありますか?

4

6 に答える 6

5

xml を検索

assembly.dll の場合は assembly.xml という名前になっていますが、Framework SDK によってインストールされるため、ランタイム自体には .xml ファイルが含まれていません。ユーザーは API ドキュメントを必要としません。

場所はもう少し複雑です。現在のロケールにちなんで名付けられたサブディレクトリ (例: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\en) または近くの奇妙なディレクトリに、dll と並べて配置できます。ランタイムがサテライト アセンブリを検索する方法で検索することをお勧めします。

要素を検索

要素を見つけるには、メタデータからいわゆる「xml-doc ID」を用意する必要があります。AFAIRは、C#言語仕様で文書化されており、MSDNで少し文書化されています。XML ドキュメントの処理を参照してください。

于 2008-10-23T19:03:19.013 に答える
4

Ilyaの応答に基づく:

xml を検索

.NET フォールバックの場所(GAC やその他の無関係なサブディレクトリは無視)

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 );
}

要素を検索

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;
}

使用例

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 );
于 2008-10-26T14:18:24.587 に答える
0

XML ファイルは、異なる 'xml' 拡張子を除いて、アセンブリのファイルとまったく同じように名前が付けられ、アセンブリ自体と同じディレクトリに配置する必要があります。

ただし、残りの 2 つの質問についてはお答えできません。私の知る限り、あなたは独力です...

于 2008-10-23T18:54:20.887 に答える