我正在尝试动态地在C#应用程序上加载一些C#DLL。我在byte[]
列表中获取了所有DLL,我想加载它们而不将它们写入dll文件。
当我想使用dll应用程序时,我的应用程序崩溃了。
它返回System.IO.FileNotFoundException
,因为它找不到dll文件。
我在每个Assembly.Load()
dll上使用byte[]
并且它似乎正常工作(没有崩溃和增加的汇编列表计数)并且我按正确的顺序加载它们(我不知道它是必要的。)
Assembly assembly = Assembly.Load(binDll);
AssemblyName[] referencedAssembly = assembly.GetReferencedAssemblies();
foreach (AssemblyName referencedAssemblyName in referencedAssembly)
{
if (!loadedDllList.Contains(referencedAssemblyName.Name) && this.Apps.Where(a => a.Item1 == referencedAssemblyName.Name).Count() > 0)
{
this.loadDll(referencedAssemblyName.Name);
}
}
TX.AddInStore.Load(binDll, dllName, null, null); //LOAD DLL on our application
loadedDllList.Add(dllName);
谢谢
答案 0 :(得分:1)
当公共语言运行时无法自行解决时,您必须订阅AppDomain.CurrentDomain.AssemblyResolve
事件并返回正确的程序集。
可以将程序集加载到多个加载上下文之一,也可以不加载上下文。 Load(byte[])
方法在没有上下文的情况下加载程序集,其中一个缺点是其他程序集无法自动绑定到它们。有关详细信息,请阅读MSDN中的Best Practices for Assembly Loading。