Это возможно на уровне проекта.Вы можете создавать различные конфигурации в решении, и когда вы добавляете ссылки, как показано ниже, это займет требуемые DLL
<Choose>
<When Condition="'$(Configuration)|$(Platform)'=='YourSpecialConfiguration1|x64'"><!-- attention here -->
<ItemGroup>
<Reference Include="your.dllv1.name">
<HintPath>yourDllPath_v1\your.dllv1.dll</HintPath><!-- attention here -->
<Private>true</Private>
</Reference>
<!-- more references here -->
</ItemGroup>
</When>
<When Condition="'$(Configuration)|$(Platform)'=='YourSpecialConfiguration2|x64'"><!-- attention here -->
<ItemGroup>
<Reference Include="your.dllv2.name">
<HintPath>yourDllPath_v2\your.dllv2.dll</HintPath><!-- attention here -->
<Private>true</Private>
</Reference>
<!-- more references here -->
</ItemGroup>
</When>
<Otherwise>
<ItemGroup>
<Reference Include="your.dllname">
<HintPath>yourRegularPath\your.dllname.dll</HintPath><!-- attention here -->
<Private>true</Private>
</Reference>
<!-- AND more references here -->
</ItemGroup>
</Otherwise>
</Choose>
То, что вы видите выше - вариант 1.
Вариант 2 - Различные проекты для каждой версии.Недостаток - если вы добавляете файл или ссылку, вам нужно добавить в каждый проект
Опция 3 - Добавить все ссылки, но объявить разные псевдонимы пространства имен (в окне свойств ссылки) для каждого.Затем в коде выполните условную компиляцию, например
ISomething myVar;
#if V1
myVar = new namespace1.ClassX();
#elif V2
myVar = new namespace2.ClassX();
#else
. . . .
#endif
И наконец:
"Я хотел бы иметь возможность вести список версий, возможно, в приложении.config и загрузите соответствующую библиотеку dll во время выполнения. "
- вам, вероятно, не нужна ни одна из них.Вам просто нужно создавать свои пакеты с разными версиями.Загрузка во время выполнения потребует больше работы по написанию кода, в то же время предоставляя все библиотеки DLL, потому что вы не знаете, что собираетесь загружать в следующий раз.