Per farlo correttamente, è necessario camminare assemblee , prendendo le dipendenze ... se il tuo exe ha bisogno di Dll_A, e Dll_A ha bisogno di Dll_B (anche se l'exe non fa riferimento a esso), allora anche il tuo exe ha bisogno di Dll_B.
È possibile eseguire una query su questo (su qualsiasi assieme) tramite riflessione; ci vuole un po 'di lavoro (in particolare in guardia contro i riferimenti circolari, che accadono; ecco un esempio che parte dal "assemblea entry", ma questo potrebbe facilmente essere qualsiasi assemblea:
List<string> refs = new List<string>();
Queue<AssemblyName> pending = new Queue<AssemblyName>();
pending.Enqueue(Assembly.GetEntryAssembly().GetName());
while(pending.Count > 0)
{
AssemblyName an = pending.Dequeue();
string s = an.ToString();
if(refs.Contains(s)) continue; // done already
refs.Add(s);
try
{
Assembly asm = Assembly.Load(an);
if(asm != null)
{
foreach(AssemblyName sub in asm.GetReferencedAssemblies())
{
pending.Enqueue(sub);
}
foreach (Type type in asm.GetTypes())
{
foreach (MethodInfo method in type.GetMethods(
BindingFlags.Static | BindingFlags.Public |
BindingFlags.NonPublic))
{
DllImportAttribute attrib = (DllImportAttribute)
Attribute.GetCustomAttribute(method,
typeof(DllImportAttribute));
if (attrib != null && !refs.Contains(attrib.Value))
{
refs.Add(attrib.Value);
}
}
}
}
}
catch (Exception ex)
{
Console.Error.WriteLine(ex.Message);
}
}
refs.Sort();
foreach (string name in refs)
{
Console.WriteLine(name);
}
fonte
2009-08-20 09:35:29
quanto ho capito esso, che darà quelli che sono già stati caricati, potrebbero essercene referenziati nei metadati, ma non sono stati ancora caricati poiché non sono stati necessari nell'esecuzione fino ad ora –
Grazie per il tuo suggerimento! Anche questo AppDomain.CurrentDomain.GetAssemblies() era interessante – Maciej