Wenn Sie ein Projekt p aus einer Lösung erhalten, die Sie über einen MSBuildWorkspace erhalten, ist es möglich, Details zu diesem Projekt MetadataReferences zu haben (in diesem Fall ist es eine .dll), wie Klassen und Methoden?Ist es möglich, Implementierungsdetails von einem Project MetaDataReferences zu erhalten?
Antwort
Rufen Sie in Ihrem Projekt GetCompilationAsync() auf, um die Kompilierung zu erhalten. Von dort aus können Sie die GlobalNamespace-Eigenschaft betrachten, die Ihnen den globalen Namespace zur Verfügung stellt, und dort können Sie zu untergeordneten Namespaces und Typen aus Ihrem Code und allen zusammengeführten Referenzen gehen. Wenn Sie Typen in bestimmten Verweisen ausführen möchten, können Sie GetAssemblyOrModuleSymbol aufrufen, um eine bestimmte Metadatenreferenz anzugeben, und Sie können dann auch von dort aus weitergehen.
foreach (var mRef in project.MetadataReferences)
{
Type[] assemblyTypes;
if (!File.Exists(mRef.Display))
continue;
try
{
assemblyTypes = Assembly.ReflectionOnlyLoadFrom(mRef.Display)
.GetTypes();
}
catch (ReflectionTypeLoadException e)
{
assemblyTypes = e.Types
.Where(type => type != null)
.ToArray();
}
// ....
}
fand ich einen Weg, um die Klassen und Methoden durch Micrososoft.CodeAnalysis Symbol Api zu erhalten, inspiriert sehr von Kevin Pilch-Bisson Post in Msdn Blog.
private void GetSymbolsTest(ref Project project, ref MetadataReference metaRef)
{
if (!project.MetadataReferences.Contains(metaRef))
throw new DllNotFoundException("metadatarefence not in project");
var compilation = project.GetCompilationAsync().Result;
var metaRefName = Path.GetFileNameWithoutExtension(metaRef.Display);
SymbolCollector symCollector = new SymbolCollector();
symCollector.Find(compilation.GlobalNamespace, metaRefName);
Console.WriteLine($"Classes found: {symCollector.Classes.Count}");
Console.WriteLine($"Methods found: {symCollector.Methods.Count}");
}
public class SymbolCollector
{
public HashSet<IMethodSymbol> Methods { get; private set; } = new HashSet<IMethodSymbol>();
public HashSet<INamedTypeSymbol> Classes { get; private set; } = new HashSet<INamedTypeSymbol>();
public void Find(INamespaceSymbol namespaceSymbol, string assemblyRefName)
{
foreach (var type in namespaceSymbol.GetTypeMembers())
{
if (String.Equals(type.ContainingAssembly.Name, assemblyRefName, StringComparison.CurrentCultureIgnoreCase))
Find(type);
}
foreach (var childNs in namespaceSymbol.GetNamespaceMembers())
{
Find(childNs, assemblyRefName);
}
}
private void Find(INamedTypeSymbol type)
{
if (type.Kind == SymbolKind.NamedType)
Classes.Add(type);
foreach (var member in type.GetMembers())
{
if (member.Kind == SymbolKind.Method)
Methods.Add(member as IMethodSymbol);
}
foreach (var nested in type.GetTypeMembers())
{
Find(nested);
}
}
}
Auf diese Weise muss ich System.Reflection nicht verwenden. Hoffe, es hilft jemandem irgendwann.
Es sieht interessant aus und könnte nützlich sein. :) –
- 1. Ist es möglich, den Simulatorzielnamen zu erhalten?
- 2. ist es möglich, Objektbewegung von affiner Registrierung zu erhalten?
- 3. Ist es möglich, monatliche Aktienkurse von Google Finance zu erhalten?
- 4. Ist es möglich, Laravel-Benutzerdaten von Vue JS zu erhalten?
- 5. Ist es möglich, ein Backup von Acumatica Portal zu erhalten?
- 6. Von diesem Parameter ist es möglich, Zielelement zu erhalten?
- 7. Object_detection Implementierungsdetails
- 8. Ist es möglich, die Ausgabe von ioreg in einem leichter zu parsen-fähigen Format zu erhalten?
- 9. Importieren von Google Project möglich
- 10. Implementierungsdetails von Windows-Leistungsindikatoren
- 11. Drag and Drop - Ist es möglich, die URL zu erhalten?
- 12. Ist es möglich, MSAL.js zu verwenden, um Aktualisierungstoken zu erhalten?
- 13. Mit openpyxl ist es möglich, den Druckbereich zu erhalten?
- 14. Ist es möglich, eine ungepufferte Webbrowser-Ausgabe zu erhalten?
- 15. Ist es möglich, "kontextuelle" Gesten in Monogame/XNA zu erhalten?
- 16. Ist es möglich, ListPreference-Elemente von einem Adapter zu laden?
- 17. Ist es möglich, in Spark + KafkaRDD spezifischen Nachrichtenoffset zu erhalten
- 18. reference_wrapper Implementierungsdetails
- 19. Ist es möglich, programmatischen Zugriff auf Finder-Vorschaubilder zu erhalten?
- 20. Ist es möglich, die integrierte SQL Server-Funktionsdefinition zu erhalten?
- 21. ist es möglich, Lua-Interpreter-Versionsinformationen im Skript zu erhalten?
- 22. ist es möglich, s3 ObjectSummary eines bestimmten Schlüssels zu erhalten?
- 23. Ist es möglich, alle Unterklassen einer Klasse zu erhalten?
- 24. Ist es möglich, ein natives Element für formControl zu erhalten?
- 25. Mit Cypher ist es möglich, Beziehungsnamen in einem Pfad zu erhalten, dessen Länge nicht vordefiniert ist?
- 26. Ist es möglich, Modellname und Feldname aus Eigenschaften zu erhalten?
- 27. Ist es möglich, eine Liste von Warteschlangen auf einem Remote-Broker zu erhalten?
- 28. Ist es möglich, eine eindeutige Identifikationsnummer von einem mobilen Gerät zu erhalten?
- 29. Ist es möglich, Profilinformationen in einem id_token von Google zu erhalten?
- 30. AlamofireImage: Ist es möglich, die Rohdaten von einem NSimageview in Swift zu erhalten?
Während es funktioniert, gibt es es sowieso nur mit Roslyn tun? Ich erkunde den SymbolApi, aber noch keinen Erfolg. –
Es gibt eine Reihe von Problemen: Die Anzeige ist nicht garantiert ein Pfad, und ReflectionOnlyLoads funktioniert möglicherweise nicht in vielen portablen/Cross-Targeting-Situationen. Siehe meine andere Antwort. –
@JasonMalinowski Danke für die Erklärung. –