Вы можете предоставить специальный обработчик событий для AssemblyResolve
, позвонив по номеру newAppDomain()
. Поставьте свой каталог таким образом AppDomain
. При загрузке типа используйте функцию loadFromAppDomain()
, чтобы вернуть ее. Это должно позволить вам копировать новые dll на C:\dlls
во время выполнения и перезагружать оттуда. (Простите, я перевел это из своего источника VB в C# в соответствии с вашим тегом.)
String dllFolder = "C:\\dlls";
public void newAppDomain()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(assemblyResolve);
}
private static Assembly assemblyResolve(Object sender, ResolveEventArgs args){
String assemblyPath = Path.Combine(dllFolder, new AssemblyName(args.Name).Name + ".dll");
if(!File.Exists(assemblyPath))
{
return null;
}
else
{
return Assembly.LoadFrom(assemblyPath);
}
}
private Type loadFromAppDomain(String className)
{
Assembly[] asses = AppDomain.CurrentDomain.GetAssemblies();
List<Type> types = new List<Type>();
foreach(Assembly ass in asses)
{
Type t = ass.GetType(className);
if(t != null) types.Add(t);
}
if(types.Count == 1)
return types.First();
else
return null;
}
Почему, на ваш взгляд, MEF ненадежен? На что еще вы посмотрели? Такой вопрос дизайна может быть лучше на [Programmers.SE], но вам нужно будет предоставить более подробную информацию и показать, что вы рассмотрели. – ChrisF
Каким образом вы хотите, чтобы это было с возможностью горячей замены? Должны ли вы быть в состоянии заменить существующую сборку, пока старый используется? –
Сколько вы готовы платить за эту функцию? Пересечение границы AppDomain не является дешевым (и это единственный способ в .Net изолировать DLL с одинаковым идентификатором) ... Использует ли IIS модель (сброс AppDomain на смену binaries/config)? –