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

时间:2013-07-12 17:17:43

标签: c# .net assemblies

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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

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

// 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中,并且每个人都可能在该文件夹中放入恶意程序)。

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

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