在不同的地方寻找.NET程序集

时间:2009-10-13 17:42:33

标签: c# .net-assembly

如何告诉我的.NET应用程序在哪里查找所需的特定程序集(除了GAC或运行应用程序的文件夹)? 例如,我想将一个程序集放在用户的Temp文件夹中,让我的应用程序知道引用的Assembly在temp文件夹中。

由于

3 个答案:

答案 0 :(得分:8)

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

我甚至使用类似的代码从数据库下载程序集并存储在IsolatedStorage中。文件名作为完整程序集名称的哈希值。然后,数据库只需要在第一次解析时下载,文件系统将为所有未来的解析提供服务。关于AssemblyResolve事件的最佳方法是你可以使用Type.GetType()和内置的Serializers。

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 :(得分:3)

有关所涉及的一些问题,请参阅此讨论:

http://bytes.com/topic/c-sharp/answers/248203-dynamic-assembly-loading

基本上,您无法更改的appbase 创建后的appdomain。您必须将其指定为 在创建新配置之前的配置,它在默认情况下不会帮助您 应用程序域。

如果要加载的程序集位于当前下方的目录中 然后你可以使用appbase添加它的相对路径 AppendPrivatePath(relativePath),然后使用Assembly.Load - 运行时 将为您探测子目录。这是最好/最简单的方法 处理它。

答案 2 :(得分:2)

System.Reflection.Assembly.LoadFrom(myFile);

http://msdn.microsoft.com/en-us/library/1009fa28.aspx

另一个替代方法是自己处理Assembly resolve事件,如StackOverflow问题:How to add folder to assembly search path at runtime in .NET?