Допустим, у меня есть метод:
private void UnZip(string FileName, string Path)
{
using (ZipFile zip = new ZipFile(FileName))
{
zip.ExtractAll(Path, ExtractExistingFileAction.DoNotOverwrite);
zip.Dispose();
}
}
Он содержится в using Ionic.Zip. Как мне, не указывая его в Reference, использовать классы и методы, подгружая динамически.
Assembly a = Assembly.LoadFile(@"C:\DotNetZip.dll");
Type classType = a.GetType("Ionic.Zip.ZipFile");
object CreateInst = Activator.CreateInstance(classType);
MethodInfo method = classType.GetMethod("ExtractAll");
Я предлагаю вам не мучиться с рефлексией, а воспользоваться событием AppDomain.AssemblyResolve:
Просто подпишитесь на него в точке входа в приложение:
static void Main(string[] args)
{
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
...
И в обработчике загрузите нужную сборку:
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
if (args.Name == "DotNetZip, Version=1.10.1.0, Culture=neutral, PublicKeyToken=6583c7c814667745")
return Assembly.LoadFile(@"C:\DotNetZip.dll");
return null;
}
Обратите внимание, это необычное событие - оно имеет возвращаемое значение. Мы должны загрузить нужную сборку и вернуть её. При возврате null будет инициировано исключение.
Всё. Метод будет работать в его первозданном виде:
private void UnZip(string FileName, string Path)
{
using (ZipFile zip = new ZipFile(FileName))
{
zip.ExtractAll(Path, ExtractExistingFileAction.DoNotOverwrite);
//zip.Dispose(); это не нужно тут
}
}
Если вы всё же намерены действовать через рефлексию, у меня работает такой вариант:
private static void UnZip(string FileName, string Path)
{
Assembly a = Assembly.LoadFile(@"C:\DotNetZip.dll");
Type classType = a.GetType("Ionic.Zip.ZipFile");
object inst = Activator.CreateInstance(classType, new object[] { FileName });
Type fileActionType = a.GetType("Ionic.Zip.ExtractExistingFileAction");
object doNotOverwrite = Enum.ToObject(fileActionType, 2);
MethodInfo method = classType.GetMethod("ExtractAll", new[] { typeof(string), fileActionType });
method.Invoke(inst, new object[] { Path, doNotOverwrite });
MethodInfo disposeMethod = classType.GetMethod("Dispose");
disposeMethod.Invoke(inst, new object[0]);
}
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники