2016-01-31 106 views
0

如何从应用程序的bin路径之外的位置使用其全显示名称加载程序集?加载多个程序集

一般人能

Assembly.LoadFrom(path); 

这个工作从自定义位置加载程序集,但似乎加载一个强命名程序集我需要指定其完整的显示名称,如

Assembly myDll = 
Assembly.Load("myDll, Version=1.0.0.1, Culture=neutral, PublicKeyToken=9b35aa32c18d4fb1"); 

但是,这里的问题是,这只引用在我的应用程序的探测路径中的程序集。

那么如果我有一个程序集dir1/asm.dll和一个程序集dir2/asm.dll并且它们都具有强名称。

如何在运行时加载它们?

+0

对不起,我的答案是SN要求之前,这篇文章可能会帮助http://stackoverflow.com/questions/3103858/load-strongly-name-assembly-from-specific-path – dbones

回答

1

运行期间,您可以指定其他目录来探测加载时通过以下方法组装:

AppDomain.CurrentDomain.ClearPrivatePath(); 
    AppDomain.CurrentDomain.AppendPrivatePath(); 

当子目录名称在安装过程中已经知道,你还可以在<probing>元素的privatePath属性指定app.config文件中,这些附加目录。

确认文件名是否正确。当你有

AppDomain.CurrentDomain.AppendPrivatePath("Subdir"); 

Assembly myDll = Assembly.Load("myDll, Version=1.0.0.1, Culture=neutral, PublicKeyToken=9b35aa32c18d4fb1"); 

那么.NET将寻找一个名为“MYDLL.DLL”目录“子目录”的可执行文件的目录下的文件。

+0

它不工作。我添加了'AppedPrivatePath'调用指向我的目录,但我对'Assembly.Load(...)'的调用仍然没有找到任何东西,并给我一个FileNotFoundException! –

+0

你是如何指定路径的?不要使用完整路径,而是相对于您的应用程序目录(* .exe所在的路径)的路径 – NineBerry

+1

我终于发现问题了:如果您在彼此之后多次调用AppendPrivatePath,例如在例如。 'AppendPrivatePath(DIR1); AppendPrivatePath(DIR2); AppendPrivatePath(dir3);'它也会按照这个顺序查找程序集。这意味着如果你有两个具有相同名称和不同身份的程序集(比如不同版本),它将通过查看目录'dir1',然后'dir2'和然后' dir3'。 ... –

0

你可以从它的位置通过使用loadFile(example here

如果你想利用一个集的多个版本考虑处理AppDomain.CurrentDomain.AssemblyResolve(example here

的例子来自加载任何组件一个小型的开源项目,它将从一个单独的“packages”文件夹中加载dll(允许包使用独立的加载器拥有自己的dependency副本)