[英]Load an assembly from another location not in the GAC
我有几个使用同一程序集所需的应用程序。 该组件可能会定期更改,并且可以由不同的MSIs
安装。 因此,我不想将其放入GAC
,随着时间的流逝,它可能会成为部署的噩梦。
如果在应用程序中将此程序集的CopyLocal
属性设置为NO ,如何告诉runtime
在哪里查找程序集?
例如,应用程序加载在C:/Program Files/<some directory>/bin
DLL
位于C:/<some other directory>
这样是否可以以这种方式加载assembly
?
我看过<codebase>
,但是我不确定该程序集是否可以强签名。 probing
似乎仅对指定为应用程序子目录的专用路径有效吗?
请告诉我。 谢谢。
为什么要将CopyLocal
设置为“否”? 避免“ DLL地狱”(又称为“部署梦m”)的通常方法是确保将DLL依赖项复制到与程序相同的目录中。 恕我直言,这是保证您正在加载所需DLL的最简单,最直接的方法。
还请注意,如果您对DLL进行签名,则将其安装在GAC中,然后在您自己的程序中需要特定版本(或最低版本,具体取决于您的需求),这也应该解决“ DLL地狱”的情况。 也就是说,其他版本的DLL的存在不会冲突,因为您需要特定的版本,.NET可以可靠地将正确的版本与错误的版本区分开。
除非这些方法...
目前尚不清楚您的确切要求是什么。 但是,如果您试图提供一种识别不在通常的程序集加载路径中的程序集的方法,则可以使用至少两种机制。
一种方法是使用ApplicationBase
和PrivateBinPath
来控制.NET如何搜索程序集。
另一种方法是处理System.AppDomain.AssemblyResolve
事件。
每当.NET尝试加载引用的程序集而找不到它时,都将引发该事件。 然后,处理程序可以执行所需的任何搜索(或为此使用固定路径),加载程序集本身(例如,使用Assembly.LoadFrom()
),然后通过事件的arguments对象返回该内容。
请注意,仅当.NET无法找到要加载的DLL时,才会引发AssemblyResolve
事件。 因此,如果不能忍受具有另一个满足该DLL程序参考要求的DLL实例,那将不是一个合适的解决方案。
使用Assembly.LoadFrom
将程序集加载到内存中,然后可以使用Activator.CreateInstance
创建首选类型的实例。 您需要对此进行用户反思:
Assembly assembly = Assembly.LoadFrom("c:\\path\\MyDll.dll");
Type type = assembly.GetType("MyClass");
object instanceOfMyType = Activator.CreateInstance(type);
看一下反射以便创建带有参数的实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.