.NET在运行时加载程序集再次

我前一段时间发布了类似的问题。 我需要在运行时加载程序集。

如果我知道运行时dll的绝对路径,这很容易。

但我不:(如果文件不在应用程序根目录下,assembly.Load()或LoadFromFile()失败。

我唯一拥有的就是dll的名字。 该DLL可能位于根,system32或甚至在GAC中。

.net是否可以自动确定dll的位置,例如:它应该先查看根目录。 如果没有移动到系统文件夹,请尝试GAC。

EDITED

我正在使用插件架构。 我不需要注册该DLL。 我有一个多用户应用程序。 我有一个包含应用程序信息的应用程序表。 每个应用程序都有一个与它关联的dll路径,其中包含与该应用程序相关的某些算法。 希望这可以帮助。


当前应用程序查找程序集时,如果它找不到一个程序集,它会在多个位置(bin文件夹,gac等)中查找,然后开发人员需要手动告诉应用程序在哪里查找。 您可以通过拦截AssemblyResolve事件并使用事件参数来告知CLR组件的位置。

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
....................
Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
   var strTempAssmbPath=
          Path.GetFullPath("C:WindowsSystem32" + args.Name.Substring(0,  args.Name.IndexOf(",")) + ".dll");

   var strTempAssmbPath2=
          Path.GetFullPath("C:Windows" + args.Name.Substring(0,  args.Name.IndexOf(",")) + ".dll");


    if (File.Exists(strTempAssmbPath))
            return Assembly.LoadFrom(strTempAssmbPath);

    if (File.Exists(strTempAssmbPath2))
            return Assembly.LoadFrom(strTempAssmbPath2);
}

您可以连接到AppDomain.CurrentDomain.AssemblyResolve事件并根据需要手动加载应用程序的程序集。


是的,有一种方法,它取决于你的dll是弱(没有公钥标记)还是强烈(使用公钥标记)命名。 如果它的名字很弱,并且你在VS中添加了一个dll的程序集引用,那么VS将首先查找应用程序的文件夹根目录,如果它没有找到它,它会查找你指定的子目录中的值您的XML配置文件中的privatePath属性。

如果它是一个强命名的dll,那么CLR将在GAC中进行搜索,因此您需要将该dll安装到GAC中。 如果你安装了一个XML配置文件,它的codeBase元素指向了dll的路径,那么CLR也可以在应用程序目录中查找。

要在GAC中指定程序集,可以在编译程序集时使用/ reference:[DLL name]开关。

链接地址: http://www.djcxy.com/p/44435.html

上一篇: .NET Load assemblies at runtime Again

下一篇: How to connect to local instance of SQL Server 2008 Express