我的应用程序使用安装在每台安装了我的应用程序的机器上的第三方 SDK,我不想在我的应用程序部署中添加这些 SDK DLL,因为它会占用大量空间。由于其他原因,无法在 GAC 中注册 DLL。无论如何,有没有办法告诉我的应用程序所需的 DLL 在特定路径上可用?
2 回答
过去我们曾在 asp.net 应用程序中使用探测路径来做类似的事情:
http://msdn.microsoft.com/en-us/library/823z9h8w.aspx
在 asp.net 中有一个副作用,当应用程序运行时,这些位置的程序集不会自动加载,只有在 bin 中找不到它们时才会自动加载。
是的,共享文件(如果出于某种原因您不想将它们放在 GAC 中)可以部署在例如Common Programs文件夹中。
根据您的应用程序的工作方式,您可能需要使用从Environment.GetSpecialFolder()获取Environment.SpecialFolders.CommonPrograms的路径或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 中,并且每个人都可能在该文件夹中放置恶意程序集)。
当然,所有这些都可以应用于任何(可访问)文件夹,哪个是最好的……这取决于您要加载的内容以及它的部署方式(您甚至可以在注册表中搜索以动态查找支持的位置文件位于)。
最后,如果您引用的程序集是强签名的,并且它们驻留在您可以<codebase>
在 .config 文件中使用的已知、固定、不可变的位置。