我可以告诉我的应用程序从特定位置加载所有程序集(DLL)吗?

我的应用程序使用第三方SDK,它安装在具有我的应用程序的每台机器上,我不想在我的应用程序部署中添加这些SDK DLL,因为它占用了大量空间。 由于其他原因,无法在GAC中注册DLL。 无论如何,有没有办法告诉我的应用程序所需的DLL在特定路径上可用?

是的,共享文件(如果由于某种原因,您不想将它们放在GAC中)可以部署在例如Common Programs文件夹中。

根据应用程序的工作方式,您可能需要使用从环境 .SetialFolders.CommonPrograms的Environment.GetSpecialFolder()获取的路径或使用AppDomain.AssemblyResolve事件的附加和事件处理程序,使用Assembly.LoadFrom()明确地加载它们。

让我们看一个原始而简单的例子:

// Put this in your initialization code public static void Main() { AppDomain.CurrentDomain.AssemblyResolve += new ResolveAssembly(MyResolveEventHandler); } private static Assembly ResolveAssembly(object sender, ResolveEventArgs e) { // Clean, check, double check and verify path name to be sure it's a valid // assembly name and it's not a relative path itself, you may even check e.RequestingAssembly string path = ...; return Assembly.LoadFrom(path); } 

如果您有目录,并且想要在启动时加载它们(以防万一…):

 private static LoadThemAll(folderPath) { foreach (var path in Directory.GetFiles(folderPath, "*.dll")) Assembly.LoadFrom(path); } 

不要忘记添加适当的error handling(对于非托管DLL,错误版本以及其他所有可能发生的情况,特别是因为程序集将加载到您的AppDomain中,并且每个人都可能在该文件夹中放入恶意程序)。

当然所有这些都可以应用于任何(可访问的)文件夹,哪一个是最好的……这取决于你要加载的内容以及它的部署方式(你甚至可以在Registry中搜索动态查找支持位置)文件位于)。

最后,如果您引用的程序集是强签名的,并且它们驻留在已知的,固定的,不可变的位置,您可以在.config文件中使用

我们在asp.net应用程序中使用了探测路径来做类似的事情:

http://msdn.microsoft.com/en-us/library/823z9h8w.aspx

在asp.net中有副作用,在应用程序运行时,这些位置的程序集不会自动加载,只有在bin中找不到它们时才会自动加载。