Ответ 1
Если ваши две библиотеки DLL имеют одинаковое имя, вам придется переименовать их. Например, Assembly1.dll и Assembly2.dll.
Добавьте эти DLL в качестве ссылки в свой проект, как обычно, и в свойствах для каждой ссылки укажите псевдоним.
в вашем коде при использовании DLL используйте extern alias
, чтобы указать, какую dll вы хотите ссылаться.
extern alias Assembly1Reference;
using Assembly1Reference::AssemblyNamespace.MyClass;
Если вы оставите его таким образом, скорее всего, получите сообщение FileNotFoundException
, в котором говорится, что он не может загружать файл или сборку. Чтобы исправить это, вам нужно добавить ResolveEventHandler
, который будет загружать нужную сборку, которую вы пытаетесь использовать. Для этого вам нужно точно указать, где вы храните файлы DLL. В приведенном ниже примере я вручную скопировал файлы Dll в папку для отладки проектов. Где он говорит "имя сборки1", вы можете найти это имя после ссылки на DLL, построить проект и открыть файл csproj с помощью блокнота. То, что нужно искать, будет ниже моего кода примера.
extern alias Assembly1Reference;
extern alias Assembly2Reference;
static void Load()
{
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
Do();
}
static void Do()
{
new Assembly1Reference.Assembly.Class();
new Assembly2Reference.Assembly.Class();
}
static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
string currentPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
if(args.Name == "Name of assembly1")//Found in csproj file after referenced and built
{
return System.Reflection.Assembly.LoadFile(System.IO.Path.Combine(currentPath, "Assembly1.dll"));
}
if(args.Name == "Name of assembly2")//Found in csproj file after referenced and built
{
return System.Reflection.Assembly.LoadFile(System.IO.Path.Combine(currentPath, "Assembly2.dll"));
}
return null;
}
Как и было обещано, вот что выглядит ссылка в файле csproj. Имя - это все внутри атрибута include.
<Reference Include="MyAssembly_3.6.2.0, Version=3.6.2.0, Culture=neutral, PublicKeyToken=12341234asdafs43, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>Resources\Assembly1.dll</HintPath>
<Aliases>Assembly1Reference</Aliases>
</Reference>
Я знаю, что это поздно, но, надеюсь, это поможет любому, кто придет на эту страницу с этого момента.