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