2013-04-16 63 views
-3

在運行時,我想加載一個程序集,並且需要找到它的依賴程序集的名稱,以便我可以確定執行給定的DLL文件需要哪些程序集。如何加載DLL文件以確定其相關的程序集名稱?

+1

我猜你將需要檢查['GetReferencedAssemblies'](http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getreferencedassemblies%28v=vs.90% 29.aspx) – V4Vendetta

+0

Thanx重播。但我的問題是,我有一個程序集Account.dll和m使用另外四個程序集作爲參考程序集。如果我只向其他人提供Account.dll,那麼其他人怎麼知道哪個程序集需要加載Account.dll –

+0

因此,你根本沒有閱讀過鏈接文檔,是否。 –

回答

4

我的代碼討厭有點用這種前段時間:

如果您加載程序集,註冊決心事件:

AppDomain.CurrentDomain.AssemblyResolve += Assemblies_AssemblyResolve; 
Assembly.LoadFile("<path to your assembly>"); 
AppDomain.CurrentDomain.AssemblyResolve -= Assemblies_AssemblyResolve; 

的決心事件處理程序被調用每一個被引用的DLL。這裏我嘗試加載程序集。

Assembly Assemblies_AssemblyResolve(object sender, ResolveEventArgs args) 
{ 
    if (args.RequestingAssembly != null) 
    { 
     return LoadAssemblyFromPath(new AssemblyName(args.Name), args.RequestingAssembly.Location); 
    } 

    if (assemblyTryPath != null) 
    { 
     return LoadAssemblyFromPath(new AssemblyName(args.Name), assemblyTryPath); 
    } 

    return null; 
} 

而一個小幫手,其中實際裝載情況:

private Assembly LoadAssemblyFromPath(AssemblyName assemblyName,string fullPath) 
{ 
    if (assemblyName == null||fullPath==null) 
     return null; 

    string path = Path.GetDirectoryName(fullPath); 
    string dllName = assemblyName.Name + ".dll"; 
    string fullPath2Try = Path.Combine(path, dllName); 

    Assembly loadedAssembly = Assembly.LoadFrom(fullPath2Try); 

    return loadedAssembly; 
} 

希望,可以幫助!

+0

這兩個'else'關鍵字都是多餘的,因爲你在'if'情況下有'return'語句。也就是說'else {'和它的伴隨'}'可以被刪除。這當然是一個編碼口味的問題,但我享受無巢代碼 – Default

+0

你是完全正確的!這是一個遺留下來的時代,代碼沒有被分解到很好的小方法(我仍在試驗)。將更新答案 – PrinceCharles

0

我找到答案。如果我們想要找到卸載程序集的引用程序集,我們可以從以下方式找到。

Assembly _Assembly = Assembly.ReflectionOnlyLoadFrom(@"H:\Account.dll"); 
AssemblyName[] _AN = _Assembly.GetReferencedAssemblies(); 
相關問題