从不在GAC中的其他位置加载程序集

本文关键字:其他 位置 加载 程序集 GAC | 更新日期: 2023-09-27 18:29:01

我有几个应用程序需要使用同一个程序集。该组件可以定期更换,并且可以由不同的MSIs安装。因此,我不想把它放在GAC中,随着时间的推移,它可能会成为部署的噩梦。

如果我在应用程序中将此程序集的CopyLocal属性设置为NO,如何告诉runtime在哪里查找程序集?

例如,应用程序加载在C:/Program Files/<some directory>/binDLLC:/<some other directory>

这样是否可以加载assembly

我看过<codebase>,但我不确定该程序集是否可以进行强签名。probing似乎只适用于指定为应用程序子目录的专用路径?

请告诉我。非常感谢。

从不在GAC中的其他位置加载程序集

使用Assembly.LoadFrom将程序集加载到内存中,然后可以使用Activator.CreateInstance创建首选类型的实例。你需要用户对此进行反思:

Assembly assembly = Assembly.LoadFrom("c:''path''MyDll.dll");
Type type = assembly.GetType("MyClass");
object instanceOfMyType = Activator.CreateInstance(type);

查看反射以创建带有参数的实例。

为什么要将CopyLocal设置为"否"?避免"DLL地狱"(又称"部署噩梦")的常用方法是确保DLL依赖项与程序复制到同一目录中。IMHO,这是保证您加载所需DLL的最简单、最直接的方法。

还要注意的是,如果您签署DLL,将其安装在GAC中,然后在您自己的程序中需要特定的版本(或最低版本,取决于您的需求),这也应该解决"DLL地狱"场景。也就是说,DLL的其他版本不会发生冲突,因为你需要一个特定的版本,而.NET可以可靠地区分正确的版本和不正确的版本。

除非这些方法。。。

目前还不清楚你的具体要求是什么。但是,如果您试图提供一种方法来识别不在通常的程序集加载路径中的程序集,那么至少有几种机制可以使用。

一种方法是使用ApplicationBasePrivateBinPath来控制.NET搜索程序集的方式。

另一种方法是处理System.AppDomain.AssemblyResolve事件。

每当.NET尝试加载引用的程序集但找不到它时,就会引发该事件。然后,处理程序可以执行所需的任何搜索(或者只使用固定路径),加载程序集本身(例如,使用Assembly.LoadFrom()),然后通过事件的arguments对象返回。

请注意,只有当.NET找不到要加载的DLL时,才会引发AssemblyResolve事件。因此,如果不能容忍DLL的不同实例满足该DLL程序的参考要求,那么这将不是一个合适的解决方案。