Jeśli urządzenie dwie biblioteki DLL mają taką samą nazwę, będziesz musiał zmienić ich nazwę. Takich jak Assembly1.dll i Assembly2.dll.
Dodaj te pliki DLL jako odniesienie w projekcie, tak jak zwykle, a we właściwościach dla każdego odwołania określ alias.
w kodzie przy użyciu bibliotek DLL należy użyć extern alias
, aby określić, co dll chcesz odwołać.
extern alias Assembly1Reference;
using Assembly1Reference::AssemblyNamespace.MyClass;
Jeśli zostawisz to tak, najprawdopodobniej dostać FileNotFoundException
mówiąc, że nie można załadować pliku lub zestawu. Aby to naprawić, musisz dodać ResolveEventHandler
, który załaduje odpowiedni zestaw, którego próbujesz użyć. Aby to zrobić, musisz dokładnie określić miejsce przechowywania plików DLL.W poniższym przykładzie ręcznie skopiowałem pliki Dll do folderu debugowania projektów. Tam, gdzie jest napisane "nazwa zestawu1", możesz znaleźć nazwę po odwołaniu się do biblioteki DLL, zbudować projekt i otworzyć plik csproj za pomocą notatnika. Czego szukać, będzie poniżej mojego przykładowego kodu.
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;
}
Zgodnie z obietnicą, oto jak wygląda plik referencyjny w pliku csproj. Nazwa jest wszystkim wewnątrz atrybutu 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>
Wiem, że jest późno, ale mam nadzieję, że pomoże to każdemu, kto wejdzie na tę stronę od teraz.
To należy do kategorii "jeśli próbujesz to zrobić, twój projekt jest poważnie uszkodzony." – cdhowie
Zdecydowanie uzgodniono, że jest to narzędzie, które potrzebuje informacji z dwóch wersji produktu firmy (zbudowanego z .NET). Ale produkt, o którym tu mowa, jest regulowany, a zatem nie można go zmienić. – varosh