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

本文关键字:程序集 DLL 加载 位置 我的 应用程序 定位 我可以 | 更新日期: 2023-09-27 18:22:11

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

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

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

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

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

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

根据应用程序的工作方式,您可能需要使用从Environment.GetSpecialFolders.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);
}

不要忘记添加正确的错误处理(对于非托管DLL,可能会发生错误版本和其他一切,尤其是因为程序集将加载到AppDomain中,每个人都可能在该文件夹中放入恶意程序集)。

当然,所有这些都可以应用于任何(可访问的)文件夹,哪一个是最好的。。。好吧,这取决于你试图加载什么以及它是如何部署的(你甚至可以在注册表中搜索,动态地找到支持文件的位置)。

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