簡體   English   中英

為什么 Aspose.PDF 組件會多次加載到 appDomain 中?

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

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