Вы не можете этого сделать, если вы хотите использовать DLL, выбранную во время выполнения, вам нужно начать с НЕ ссылки на него непосредственно в вашем проекте (который не может быть изменен во время выполнения), а затем вручную загрузить его в вашем приложении, используя Assembly.Load, и подумайте над ним, чтобы использовать его типы (поскольку вы не знаете типы во время компиляции, поскольку на них не ссылаются, поэтому вам нужно запрограммировать его на типы, которые вы запрашиваете).
Итак, если вы уже запрограммированы против ссылающейся dll, вы сделали это неправильно, так как весь способ использования кода Внутри он отличается, если вам нужно, чтобы он был динамическим.
Например, если у вас есть типа «MyType» с методом «MyMethod» в DLL с именем «MyDLL.dll», если вы ссылаетесь его, используя это так же просто, как делать
new mytype().mymethod();
Если вы повторно не ссылки на DLL, но его решения динамически это будет выглядеть как
var asm = Assembly.Load("mydll.dll");
var type = asm.DefinedTypes.Single(t=>t.Name == "mytype");
var instance = Activator.CreateInstance(type);
var methodinfo = type.GetMethod("mymethod");
methodinfo.Invoke(instance);
Кроме того, мы должны знать, что вы пытаетесь достичь, есть способы, чтобы сделать это немного проще, но это зависит от случая использования (в плагиновой системе, например, вы объявите интерфейс для плагина и поделитесь этой DLL и ссылайтесь на него напрямую, только динамически загружайте плагины, чтобы вы могли напрямую приводить экземпляр к этому интерфейсу и не требовать динамического вызова методов)
По этому описанию это похоже на архитектуру с подключаемым модулем, вы смотрите на что-то как это? – Alejandro