Я предлагаю вам попробовать упростить вашу проблему, потому что я просто попытался воспроизвести вашу ситуацию и не столкнулся с проблемой. Я создал сборку Lib.dll, скомпилировал ее, создал консольное приложение, которое загрузило его с помощью LoadFile, затем переименовал Lib.dll и ссылку на консоль на «LibNew.dll». Затем я перекомпилировал lib.dll и запустил консольное приложение. В этот момент мне не удалось удалить LibNew.dll, но я смог удалить Lib.dll.
Я подозреваю, что ваш Lib.dll, возможно, загружает некоторую информацию из своей сборки при запуске и использует для этого внутреннюю функцию Load, что в итоге приводит к нахождению исходного Lib.dll. Но если у вас очень простая DLL, она не будет выполнять эту дополнительную нагрузку. В моей DLL есть функция, которую я смог вызвать, но я все еще видел результаты, о которых я сообщал выше. Вот мой код:
Консольное приложение:
class Program
{
static void Main(string[] args)
{
System.Reflection.Assembly assy = System.Reflection.Assembly.LoadFile(args[0]);
Type class1 = assy.GetType("Lib.Class1");
System.Reflection.MethodInfo myMethod = class1.GetMethod("MyMethod");
Console.WriteLine(myMethod.Invoke(null, new object[] {"This is a string"}).ToString());
Console.ReadLine();
}
}
Lib:
namespace Lib
{
public class Class1
{
public static string MyMethod(string param)
{
return "Fixed: [" + param.Replace(" ", "-") + "]";
}
}
}
Отслеживая только вызовы LoadImage, я вижу, что он не пытался загрузить Lib.dll:
Однако, отслеживая все события, я вижу, что сделал поиск Lib.dll в каталоге приложения.
Может быть, если вы поместите DLL в другой каталог, вы сможете принудительно настроить желаемое поведение? Это странное поведение, учитывая документацию.