Нужен инструмент для сброса ссылочных типов и элементов для сборки - PullRequest
0 голосов
/ 20 января 2010

Мне нужен инструмент, который может выводить ссылочные типы, используемые сборкой, в машиночитаемом формате.

например. этот код в сборке 'dummy.exe'

static void Main()
{
  Console.WriteLine("Hello World");
}

будет производить что-то вроде

<references assembly="dummy.exe">
  <mscorlib>
    <System.Console>
      <WriteLine/>
...

Можете ли вы сделать это с отражателем?

Ответы [ 2 ]

0 голосов
/ 20 января 2010

Отражатель способен отображать импортированные типы и сборки.Щелкните правой кнопкой мыши сборку и выберите Анализ в контекстном меню.Затем вы можете развернуть сгенерированное древовидное представление и скопировать текстовое представление зависимостей (но без XML, простой простой текст).Например, для сборки PresentationCore , которую вы получите (не все ссылки раскрыты в приведенном ниже примере):

PresentationCore
  Depends On
    Microsoft.VisualC
        Microsoft.VisualC.DebugInfoInPDBAttribute..ctor()
        Microsoft.VisualC.MiscellaneousBitsAttribute..ctor(Int32)
    mscorlib
    PresentationCFFRasterizer
    System
    System.Deployment
    System.Drawing
    System.Xml
    UIAutomationProvider
    UIAutomationTypes
    WindowsBase
  P/Invoke Imports
    ADVAPI32.dll
        <Module>.CloseServiceHandle(SC_HANDLE__*) : Int32 modopt(CallConvStdcall)
        <Module>.CreateWellKnownSid(WELL_KNOWN_SID_TYPE, Void*, Void*, UInt32 modopt(IsLong)*) : Int32 modopt(CallConvStdcall)
        <Module>.InitializeSecurityDescriptor(Void*, UInt32 modopt(IsLong)) : Int32 modopt(CallConvStdcall)
        <Module>.OpenSCManagerW(UInt16 modopt(IsConst)*, UInt16 modopt(IsConst)*, UInt32 modopt(IsLong)) : SC_HANDLE__* modopt(CallConvStdcall)
        <Module>.OpenServiceW(SC_HANDLE__*, UInt16 modopt(IsConst)*, UInt32 modopt(IsLong)) : SC_HANDLE__* modopt(CallConvStdcall)
        <Module>.QueryServiceStatus(SC_HANDLE__*, _SERVICE_STATUS*) : Int32 modopt(CallConvStdcall)
        <Module>.RegCloseKey(HKEY__*) : Int32 modopt(IsLong) modopt(CallConvStdcall)
        <Module>.RegOpenKeyExW(HKEY__*, UInt16 modopt(IsConst)*, UInt32 modopt(IsLong), UInt32 modopt(IsLong), HKEY__**) : Int32 modopt(IsLong) modopt(CallConvStdcall)
        <Module>.RegQueryInfoKeyW(HKEY__*, UInt16*, UInt32 modopt(IsLong)*, UInt32 modopt(IsLong)*, UInt32 modopt(IsLong)*, UInt32 modopt(IsLong)*, UInt32 modopt(IsLong)*, UInt32 modopt(IsLong)*, UInt32 modopt(IsLong)*, UInt32 modopt(IsLong)*, UInt32 modopt(IsLong)*, _FILETIME*) : Int32 modopt(IsLong) modopt(CallConvStdcall)
        <Module>.RegQueryValueExW(HKEY__*, UInt16 modopt(IsConst)*, UInt32 modopt(IsLong)*, UInt32 modopt(IsLong)*, Byte*, UInt32 modopt(IsLong)*) : Int32 modopt(IsLong) modopt(CallConvStdcall)
        <Module>.SetSecurityDescriptorDacl(Void*, Int32, _ACL*, Int32) : Int32 modopt(CallConvStdcall)
        <Module>.SetSecurityDescriptorSacl(Void*, Int32, _ACL*, Int32) : Int32 modopt(CallConvStdcall)
        <Module>.StartServiceW(SC_HANDLE__*, UInt32 modopt(IsLong), UInt16 modopt(IsConst)**) : Int32 modopt(CallConvStdcall)
    KERNEL32.dll
    mscms.dll
    mshwgst.dll
    MSVCR80.dll
    ntdll.dll
    ole32.dll
    penimc.dll
    PresentationNative_v0300.dll
    shfolder.dll
    urlmon.dll
    user32.dll
    WindowsCodecs.dll
    WindowsCodecsExt.dll
    wpfgfx_v0300.dll
0 голосов
/ 20 января 2010

Получение ссылочных типов и членов для произвольной сборки будет чрезвычайно сложным; вам понадобится глубокий инструмент IL - по сути отражатель. Byt для получения ссылок сборок (и отслеживания циклических ссылок, которые возможны ), что-то вроде:

static void Main() {
    WriteReferences(Assembly.GetEntryAssembly());        
}
static void WriteReferences(Assembly assembly) {
    HashSet<string> done = new HashSet<string>();
    Queue<AssemblyName> pending = new Queue<AssemblyName>();
    foreach (var name in assembly.GetReferencedAssemblies()) {
        pending.Enqueue(name);
    }
    while(pending.Count > 0) {
        var name = pending.Dequeue();
        string s = name.FullName;
        if (done.Add(s)) {
            Console.WriteLine(s);
            try {
                Assembly asm = Assembly.Load(name);
                foreach (var next in asm.GetReferencedAssemblies()) {
                    pending.Enqueue(next);
                }
            }
            catch { }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...