[英]Why are Aspose.PDF assmeblies loaded multiple times into the appDomain?
一旦在另一個 dll 中調用所述 dll 的某些組件,在 AppDomian.AssemblyResolve 事件中加載 Aspose.PDF.dll 會導致“幽靈”程序集。
這里的問題是 Aspose.PDF.dll 的注冊不起作用,因為那些創建的“幽靈”程序集或至少是我認為問題所在。
所以基本上:為什么會有那些“幽靈”程序集?
首先,我得到了以下組件:-控制台應用程序(主)-類庫(MyDll)-3rd 方 dll 在這種情況下 Aspose.PDF.dll
Main 沒有對 MyDll 的引用,也沒有對 3rd 方 dll 的引用。 MyDll 引用了特定版本的 3rd 方 dll。
我想從遠程位置將正確版本的 Aspose.PDF.dll 加載到與 MyDll 要求的版本相對應的 AppDomain 中。
為了實現這一點,我訂閱了AppDomain.AssemblyResolve
事件。 如果調用 MyDll 並請求 clr 找不到的程序集,我將使用 LoadFrom 加載相應的 dll。 到目前為止,這運行良好,但是在監視加載的程序集時,當我調用AppDomain.CurrentDomain.GetAssemblies()
,我注意到有一些程序集的名稱很奇怪,但似乎是 Aspose.PDF 程序集(公鑰是一樣的)。 那些只在 MyDll 中的某些方法被調用后出現。 所有這些方法都包含 Aspose.PDF 方法調用。
我創建了一個示例來演示這個問題。 首先是主控制台應用程序。
class Program
{
static void Main(string[] args)
{
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
AppDomain.CurrentDomain.AssemblyLoad += CurrentDomain_AssemblyLoad;
Assembly myAssembly = Assembly.LoadFile(@"FullPathToMyDll\MyDll.dll");
Type myType = myAssembly.GetType("myDll.Class1");
var myTypeInstance = Activator.CreateInstance(myType);
myType.InvokeMember("DoAction", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Instance, null, myTypeInstance, null);
Console.ReadLine();
}
private static void CurrentDomain_AssemblyLoad(object sender, AssemblyLoadEventArgs args)
{
StringBuilder stb = new StringBuilder();
stb.AppendLine(new string('-', 20));
foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
stb.AppendLine(assembly.FullName);
}
stb.AppendLine(new string('-', 20));
Console.WriteLine(stb.ToString());
}
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
var nameSplitted = args.Name.Split(',');
Assembly assemblyToReturn = null;
if(args.Name.Contains("19.2.0.0"))
assemblyToReturn = Assembly.LoadFrom(@"FullPathToDll\Apsose_19.2\Aspose.PDF.dll");
if (args.Name.Contains("19.6.0.0"))
assemblyToReturn = Assembly.LoadFrom(@"FullPathToDll\Apsose_19.6\Aspose.PDF.dll");
return assemblyToReturn;
}
}
我的DLL.dll:
public class Class1
{
public Class1()
{
Console.WriteLine(Aspose.Pdf.BuildVersionInfo.FileVersion);
Console.WriteLine(Aspose.Pdf.BuildVersionInfo.Product);
Console.WriteLine(Aspose.Pdf.BuildVersionInfo.AssemblyVersion);
}
public void DoAction()
{
// Part of the 3rd party dll
Document doc = new Document();
// After the following line the "ghost assemblies appear"
bool licensed = Document.IsLicensed;
Console.WriteLine(doc.GetType().Assembly.FullName);
}
}
加載的“幽靈程序集”的圖像我不認為應該有那些“幽靈”程序集,我認為它們會導致注冊 3rd 方 dll(不包括在本示例中)出現問題。
這是我關於 stackoverflow 的第一個問題,所以請給我任何關於我如何提出問題以及我可以做得更好的反饋。
我在加載時硬編碼了“奇怪的程序集名稱”,例如我使用
string fullName = "Aspose.PDF, Version=21.2.0.0, Culture=neutral, PublicKeyToken=f0262d67fe233d63";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.