Files
2024-01-08 09:30:50 +08:00

149 lines
4.4 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Threading;
namespace KGdev.BI3D.Revit.Addin.MainWindow.External.Browser
{
public class AssemblyLoaderUtil
{
public AssemblyLoaderUtil(string assemblyDir)
{
AssemblyDirectory = assemblyDir;
}
public string AssemblyDirectory { get; set; }
public void HookAssemblyResolve()
{
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
}
/// <summary>
/// 加载目录下的所有程序集
/// </summary>
/// <param name="commandFolderPath"></param>
/// <returns></returns>
public List<Assembly> LoadAllRibbonAssemblies(string commandFolderPath)
{
var list = new List<Assembly>();
foreach (var assemblyFile in Directory.GetFiles(commandFolderPath, "*.dll"))
{
try
{
list.Add(Assembly.LoadFrom(assemblyFile));
}
catch
{
// ignored
}
}
return list;
}
///// <summary>
///// 调用此方法解决UI程序集丢失
///// </summary>
///// <param name="action"></param>
//public static void ResolveAssembly(Action action)
//{
// string addInPath = typeof(AssemblyLoaderUtil).Assembly.Location;
// string dirAssembly = Path.GetDirectoryName(addInPath);
// AssemblyLoaderUtil loaderUtil = new AssemblyLoaderUtil(dirAssembly);
// loaderUtil.HookAssemblyResolve();
// try
// {
// action();
// }
// catch (Exception ex)
// {
// MessageBox.Show(ex.InnerException?.ToString());
// }
// finally
// {
// loaderUtil.UnhookAssemblyResolve();
// }
//}
public void UnhookAssemblyResolve()
{
AppDomain.CurrentDomain.AssemblyResolve -= CurrentDomain_AssemblyResolve;
}
private Assembly LoadAddin(string filePath)
{
Assembly result;
try
{
Monitor.Enter(this);
result = Assembly.LoadFile(filePath);
}
finally
{
Monitor.Exit(this);
}
return result;
}
private string SearchAssemblyFile(string assemblyName)
{
string[] array = { ".dll", ".exe" };
var str = assemblyName.Substring(0, assemblyName.IndexOf(','));
foreach (var str2 in array)
{
var text = AssemblyDirectory + "\\" + str + str2;
if (File.Exists(text))
{
return text;
}
}
return string.Empty;
}
private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
Assembly result;
_ = new AssemblyName(args.Name);
var text = SearchAssemblyFile(args.Name);
if (File.Exists(text))
{
result = LoadAddin(text);
}
else
{
if (string.IsNullOrEmpty(text))
{
var array = args.Name.Split(',');
var text2 = array[0];
if (array.Length > 1)
{
var text3 = array[2];
if (
text2.EndsWith(".resources", StringComparison.CurrentCultureIgnoreCase)
&& !text3.EndsWith("neutral", StringComparison.CurrentCultureIgnoreCase)
)
{
text2 = text2.Substring(0, text2.Length - ".resources".Length);
}
text = SearchAssemblyFile(text2);
if (File.Exists(text))
{
return LoadAddin(text);
}
//text = this.SearchAssemblyFile(text2);
}
}
result = LoadAddin(text);
}
return result;
}
}
}