在另一个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的第一个问题,所以请给我有关我如何提出问题以及我可以做得更好的任何反馈。
答案 0 :(得分:1)
我在加载时硬编码了“奇怪的程序集名称”,例如我使用的
string fullName = "Aspose.PDF, Version=21.2.0.0, Culture=neutral, PublicKeyToken=f0262d67fe233d63";