为什么Aspose.PDF组件多次加载到appDomain中?

时间:2019-06-17 05:52:28

标签: c# .net .net-assembly aspose.pdf

在另一个dll内部调用所述dll的某些组件后,在AppDomian.AssemblyResolve事件中加载Aspose.PDF.dll会导致“鬼”程序集。

这里的问题是,Aspose.PDF.dll的注册由于我认为是问题的“鬼”程序集被创建或至少不起作用而无法正常工作。

所以基本上:为什么会有那些“鬼”程序集?

首先,我得到以下组件: -控制台应用程序(主要) 类库(MyDll) -3rd dll在这种情况下为Aspose.PDF.dll

Main没有引用MyDll,也没有引用第三方dll。 MyDll引用了第三方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;
        }
    }

MyDll.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);
    }
}

Image of loaded "ghost assemblies" 我不认为应该有那些“ ghost”程序集,并且我认为它们会导致第三方dll的注册出现问题(此示例中未包括)。

这是我关于stackoverflow的第一个问题,所以请给我有关我如何提出问题以及我可以做得更好的任何反馈。

1 个答案:

答案 0 :(得分:1)

我在加载时硬编码了“奇怪的程序集名称”,例如我使用的

string fullName = "Aspose.PDF, Version=21.2.0.0, Culture=neutral, PublicKeyToken=f0262d67fe233d63";