通過MSBuildWorkspace獲得解決方案中的Project p是否可以獲取該項目的MetadataReferences(在本例中爲.dll)的詳細信息,例如類和方法?是否可以從Project MetaDataReferences獲取實現細節?
0
A
回答
1
在你的項目上,調用GetCompilationAsync()來獲得編譯。從那裏你可以看到GlobalNamespace屬性,它給你全局命名空間,在那裏你可以從代碼中走到子命名空間和類型,並且所有引用合併在一起。如果你想在特定的引用中遍歷類型,你可以調用GetAssemblyOrModuleSymbol給它一個特定的元數據引用,然後它可以讓你從那裏走。
0
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();
}
// ....
}
1
我發現通過獲取符號Micrososoft.CodeAnalysis API的類和方法,通過Kevin Pilch-Bisson後在MSDN博客非常鼓舞的一種方式。
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);
}
}
}
這樣我不需要使用System.Reflection。希望在某個時候幫助別人。
+0
這看起來很有趣,可能會有用。 :) –
相關問題
- 1. 是否可以從PDDL實現中獲取多個計劃?
- 2. 實現細節
- 3. Groovy實現細節
- 4. 是否可以從msi獲取現有安裝的詳細清單?
- 5. Object_detection實現細節
- 6. Android:Library Project:是否可以從Library Project啓動IntentService?
- 7. Collectors.toSet實現細節
- 8. 是否可以實時進行細分?
- 9. 是否可以從WCF IDataContractSurrogate實現中讀取請求標頭?
- 10. Qt:是否可以從QWebFrame獲取QScriptEngine?
- 11. 是否可以從QModelIndex獲取Qpoint
- 12. 是否可以從PropertyInfo獲取「對象」?
- 13. LongAdder Striped64 wasUncontended實現細節
- 14. 可以公開獲取getter時是否可以明確實現property setter?
- 15. 需要PEP302實現細節
- 16. akka patterns.ask實現細節
- 17. 細節和實現的
- 18. ImmutableCollections SetN實現細節
- 19. IVR技術實現細節
- 20. 實現細節的定義是什麼?
- 21. clojure.lang真的只是實現細節?
- 22. 什麼是實現細節的枚舉?
- 23. git rebase實現細節
- 24. 是否可以從CLLocation(或CLLocationCoordinates2D)獲取NSTimeZone實例?
- 25. 是否可以從堆棧跟蹤中獲取實際類型?
- 26. deque的實現細節
- 27. 我在哪裏可以找到.Net類的實現細節?
- 28. 是否可以從HTML頁面獲取個人計算機詳細信息
- 29. 是否可以從Google分析Cookie中獲取utm_source/utm_medium等詳細信息?
- 30. 是否可以使用FQL實現friends.getMutualFriends?
雖然它的確行得通,但有沒有辦法只使用roslyn?我正在探索SymbolApi,但尚未成功。 –
這有很多問題:顯示不能保證是一個路徑,而ReflectionOnlyLoads可能無法在很多便攜/跨目標的情況下工作。看到我的其他答案。 –
@JasonMalinowski感謝您的解釋。 –