如果您兩個DLL具有相同的名稱,您將不得不重命名它們。如Assembly1.dll和Assembly2.dll。
將這些DLL作爲參考添加到項目中,就像您通常會在每個參考的屬性中指定一個別名一樣。
在您的代碼中使用DLL時使用extern alias
來指定您要引用的dll。
extern alias Assembly1Reference;
using Assembly1Reference::AssemblyNamespace.MyClass;
如果你離開它這樣,你將最有可能得到一個FileNotFoundException
說,它無法加載文件或程序集。要解決這個問題,你需要添加一個ResolveEventHandler
,它會加載你正在使用的正確的程序集。要做到這一點,你必須指定你的DLL文件的存儲位置。在下面的情況下,我手動將Dll文件複製到項目調試文件夾。在說到「assembly1名稱」的地方,你可以在引用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>
我知道這是晚了,但希望它能幫助任何人從現在開始到此頁面。
這完全屬於「如果你試圖做到這一點,你的設計被嚴重破壞」。 – cdhowie 2010-12-14 23:09:07
絕對同意,這是一個需要來自公司產品(使用.NET構建)的兩個版本的信息的工具。但是這裏所討論的產品是受到管制的,因此不能改變。 – varosh 2010-12-15 18:55:20