簡體   English   中英

具有路徑和完整程序集名稱的Assembly.LoadFrom

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM