我見過幾個類似的問題,但沒有解決我的問題。場景是 - 我有外部存儲器中的幾個DLL,我需要獲得關於它們的信息(Assembly版本和AssemblyInformationalVersion是特定的)。我從下面的代碼開始:將程序集加載到臨時應用程序域
List<byte[]> assemblies = _client.DownloadAllAssemblies();
foreach(var assemblyBytes in assemblies)
{
var assembly = Assembly.ReflectionOnlyLoad(assemblyBytes);
var assemblyName = assembly.GetName();
... // read version from assembly name
}
上面的代碼只工作一次。如果我點擊一個按鈕來刷新視圖 - 它會拋出異常說組件已經加載並且無法重新加載它。然後我讀到,我應該創建臨時域並加載程序集,以便在完成後卸載AppDomain。我嘗試下面的代碼:
List<byte[]> assemblies = _client.DownloadAllAssemblies();
var tempDomain = AppDomain.Create("TemporaryDomain");
foreach(var assemblyBytes in assemblies)
{
var assembly = tempDomain.Load(assemblyBytes);
var assemblyName = assembly.GetName();
... // read version from assembly name
}
AppDomain.Unload(tempDomain);
上面的代碼拋出FileNotFound異常說「無法加載文件或程序......」
我明白爲什麼它正在發生,但我不知道如何來解決此。任務似乎很簡單:
- 加載文件,
- 閱讀它的版本,
- 忘掉它。
上面的邏輯沒有什麼複雜的。看起來像運行時需求過於複雜。有誰知道我怎麼能使它工作?
需要更多的堆棧跟蹤(總是提供完整的信息)有可能在加載任何傳入的字節數組之前,依賴程序集無法加載。您應從「應用程序域」複製某些屬性默認,如探測路徑。你還想使用'ReflectionOnlyLoad',它不會試圖解決所有問題。 –
@ escape-llc AppDomain不公開「ReflectionOnlyLoad」函數。稍後我會用StackTrace更新問題。謝謝。 – MajkeloDev