[英]Assembly.LoadFrom with path and full assembly name
我正在嘗試基於Environment.Is64BitProcess
實現某些程序集的動態加載。
這基本上是這樣的:
AppDomain.AssemblyResolve
事件的事件處理程序 在事件處理程序中,從依賴於CPU類型的子路徑加載程序集:
private Assembly OnAssemblyResolve(object sender, ResolveEventArgs args) { // args.Name is the display name of an assembly, eg: // MyAssembly, Version=5.0.0.0, Culture=neutral, PublicKeyToken=abcdefghijklmn if(!args.Name.Contains("MyAssembly")) return null; var path = Path.Combine(GetCpuTypeDependentPath(), "MyAssembly.dll"); return Assembly.LoadFrom(path); }
現在,這有一個問題,它不檢查加載的程序集的版本,publicKeyToken等。
我現在想做的是調用Assembly.Load
並簡單地提供一條額外的探測路徑。 我知道這是行不通的,因為沒有這樣的過載。 還有其他方法可以實現我的目標嗎?
只需將找到的程序集的屬性與所請求的程序集的屬性進行比較即可。 例如,版本檢查可能如下所示:
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) {
var name = new AssemblyName(args.Name);
string path = System.IO.Path.Combine(IntPtr.Size == 8 ? "x64" : "x86", name.Name + ".dll");
path = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), path);
var asm = Assembly.LoadFrom(path);
var found = new AssemblyName(asm.FullName);
if (name.Version != found.Version) throw new System.IO.FileNotFoundException(name.FullName);
return asm;
}
除非自己自己探測程序集,否則我看不到您可以執行此操作。 您只需要啟動另一個AppDomain即可搜索匹配的程序集,這樣就可以卸載在探測期間加載的程序集。 不幸
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.