在不同的位置查找.NET程序集

7

我该如何告诉我的.NET应用程序在哪里查找特定的程序集(除了GAC或应用程序运行的文件夹)?

例如,我想将一个程序集放在用户的Temp文件夹中,并让我的应用程序知道所引用的程序集在临时文件夹中。

谢谢。

3个回答

11

你可以使用AppDomain.AssemblyResolve事件来添加自定义程序集解析器。这允许您指向其他目录甚至数据库以根据需要获取程序集。

我甚至使用了类似的代码从数据库中下载程序集并存储在IsolatedStorage中。文件名是完整程序集名称的哈希值。然后,数据库只需要在第一次解析时进行下载,所有未来的解析都将由文件系统提供。AssemblyResolve事件最好的部分是您可以将其用于Type.GetType()和内置序列化程序。

static string lookupPath = @"c:\otherbin";

static void Main(string[] args)
{
    AppDomain.CurrentDomain.AssemblyResolve += 
        new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}

static Assembly CurrentDomain_AssemblyResolve(object sender, 
                                              ResolveEventArgs args)
{
    var assemblyname = new AssemblyName(args.Name).Name;
    var assemblyFileName = Path.Combine(lookupPath, assemblyname + ".dll");
    var assembly = Assembly.LoadFrom(assemblyFileName);
    return assembly;
}

1
此处所述,使用string assemblyname = new AssemblyName(args.Name).Name;而不是使用Split(',') - kroimon

3
请参考以下讨论,了解一些相关问题:http://bytes.com/topic/c-sharp/answers/248203-dynamic-assembly-loading 基本上,在创建appdomain之后,您无法更改其appbase。您必须在创建新的appdomain之前将其作为配置的一部分进行指定,这对于默认的appdomain没有帮助。
如果您要加载的程序集位于当前appbase下的目录中,则可以使用AppendPrivatePath(relativePath)添加其相对路径,然后使用Assembly.Load - 运行时会为您探测子目录。这是处理它的最佳/最简单的方法。

谢谢,只是想说明一下,我不需要动态加载它。我正在我的项目中引用该程序集。但是当我部署该应用程序时,我希望应用程序知道所引用的程序集将在临时文件夹中。 - G-Man

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接