Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么将Aspose.PDF关联多次加载到appDomain中?_C#_.net_.net Assembly_Aspose.pdf - Fatal编程技术网

C# 为什么将Aspose.PDF关联多次加载到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的引

在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中

为了实现这一点,我订阅了
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一起工作,担任开发人员传道者。