C# 为什么将Aspose.PDF关联多次加载到appDomain中?
在AppDomian.AssemblyResolve事件中加载Aspose.PDF.dll会在另一个dll中调用所述dll的某些组件时立即导致“重影”程序集 这里的问题是Aspose.PDF.dll的注册不起作用,因为创建了或至少创建了那些“重影”程序集,我认为这就是问题所在 那么基本上:为什么会有那些“幽灵”装配 首先,我得到了以下组件: -控制台应用程序(主) -类库(MyDll) -第三方dll在本例中为Aspose.PDF.dll Main没有对MyDll的引用,也没有对第三方dll的引用。 MyDll引用了第三方dll的特定版本 我想从远程位置将正确版本的Aspose.PDF.dll加载到与MyDll要求的版本相对应的AppDomain中 为了实现这一点,我订阅了C# 为什么将Aspose.PDF关联多次加载到appDomain中?,c#,.net,.net-assembly,aspose.pdf,C#,.net,.net Assembly,Aspose.pdf,在AppDomian.AssemblyResolve事件中加载Aspose.PDF.dll会在另一个dll中调用所述dll的某些组件时立即导致“重影”程序集 这里的问题是Aspose.PDF.dll的注册不起作用,因为创建了或至少创建了那些“重影”程序集,我认为这就是问题所在 那么基本上:为什么会有那些“幽灵”装配 首先,我得到了以下组件: -控制台应用程序(主) -类库(MyDll) -第三方dll在本例中为Aspose.PDF.dll Main没有对MyDll的引用,也没有对第三方dll的引
AppDomain.AssemblyResolve
事件。
如果调用MyDll并请求clr找不到的程序集,我将使用LoadFrom加载相应的dll。
到目前为止,这工作得很好,但在监视加载的程序集时,我在调用AppDomain.CurrentDomain.getAssemblys()时发现,有些程序集的名称很奇怪,但看起来像是Aspose.PDF程序集(公钥是相同的)。这些仅在调用MyDll中的某些方法后出现。所有这些方法都包含Aspose.PDF方法调用
我创建了一个示例来演示这个问题。首先是主控制台应用程序
类程序
{
静态void Main(字符串[]参数)
{
AppDomain.CurrentDomain.AssemblyResolve+=CurrentDomain_AssemblyResolve;
AppDomain.CurrentDomain.AssemblyLoad+=CurrentDomain_AssemblyLoad;
Assembly myAssembly=Assembly.LoadFile(@“FullPathToMyDll\MyDll.dll”);
类型myType=myAssembly.GetType(“myDll.Class1”);
var myTypeInstance=Activator.CreateInstance(myType);
myType.InvokeMember(“DoAction”,BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Instance,null,myTypeInstance,null);
Console.ReadLine();
}
私有静态无效CurrentDomain_AssemblyLoad(对象发送方、AssemblyLoadEventArgs args args)
{
StringBuilder stb=新的StringBuilder();
stb.AppendLine(新字符串('-',20));
foreach(AppDomain.CurrentDomain.GetAssemblys()中的程序集)
{
stb.AppendLine(assembly.FullName);
}
stb.AppendLine(新字符串('-',20));
Console.WriteLine(stb.ToString());
}
私有静态程序集CurrentDomain_AssemblyResolve(对象发送方、ResolveEventArgs args args)
{
var namesplit=args.Name.Split(',');
Assembly assemblyToReturn=null;
if(args.Name.Contains(“19.2.0.0”))
assemblyToReturn=Assembly.LoadFrom(@“FullPathToDell\apose_19.2\Aspose.PDF.dll”);
if(args.Name.Contains(“19.6.0.0”))
assemblyToReturn=Assembly.LoadFrom(@“FullPathToDell\apose_19.6\Aspose.PDF.dll”);
返回集合返回;
}
}
MyDll.dll:
公共类1
{
公共类别1()
{
WriteLine(Aspose.Pdf.BuildVersionInfo.FileVersion);
WriteLine(Aspose.Pdf.BuildVersionInfo.Product);
WriteLine(Aspose.Pdf.BuildVersionInfo.AssemblyVersion);
}
公共无效行为()
{
//第三方dll的一部分
单据单据=新单据();
//在下一行之后出现“重影程序集”
bool licensed=Document.IsLicensed;
Console.WriteLine(doc.GetType().Assembly.FullName);
}
}
我不认为应该有那些“ghost”程序集,我认为它们会导致第三方dll的注册出现问题(本例中不包括)
这是我关于stackoverflow的第一个问题,请给我一些反馈,说明我是如何提出问题的,以及我可以做得更好。我在加载时硬编码了“奇怪的程序集名称”,例如我使用的
string fullName = "Aspose.PDF, Version=21.2.0.0, Culture=neutral, PublicKeyToken=f0262d67fe233d63";
请与我们分享您的示例应用程序以及所有必要的资源,以便我们调查该场景。PS:我和Aspose一起工作,担任开发人员传道者。