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

时间:2014-11-04 03:39:06

标签: c# .net .net-assembly gac assembly-resolution

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

如果我将此程序集的CopyLocal属性转换为,请如何告诉runtime在哪里查找程序集?

E.g。应用程序加载到C:/Program Files/<some directory>/bin DLL位于C:/<some other directory>

这样可以以这种方式加载assembly吗?

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

请告诉我。谢谢。

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

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

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

答案 1 :(得分:1)

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

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

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

object instanceOfMyType = Activator.CreateInstance(type);

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