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

问题描述 投票:0回答:2

我有几个应用程序需要使用相同的程序集。这个组件可以定期更换,并可以通过不同的MSIs安装。出于这个原因,我不想把它放在GAC中,随着时间的推移它可能成为部署的噩梦。

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

例如。应用程序加载在C:/Program Files/<some directory>/bin DLLC:/<some other directory>

因此可以这样加载assembly吗?

我看过<codebase>,但我不确定组装是否可以强烈签名。并且probing似乎只适用于指定为应用程序子目录的私有路径?

请告诉我。谢谢。

c# .net .net-assembly gac assembly-resolution
2个回答
1
投票

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

Assembly assembly = Assembly.LoadFrom("c:\\path\\MyDll.dll");

Type type = assembly.GetType("MyClass");

object instanceOfMyType = Activator.CreateInstance(type);

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


2
投票

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

另请注意,如果您对DLL进行签名,请将其安装在GAC中,然后在您自己的程序中需要特定版本(或最低版本,具体取决于您的需要),这也应该解决“DLL地狱”场景。即DLL的其他版本的存在不会发生冲突,因为您需要特定的版本,.NET可以可靠地区分正确的版本和不正确的版本。

除非这些方法......

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.