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