【发布时间】:2010-12-06 10:00:18
【问题描述】:
我如何告诉我的 .NET 应用程序在哪里寻找它需要的特定程序集(除了 GAC 或运行应用程序的文件夹)? 例如,我想将一个程序集放在用户的 Temp 文件夹中,并让我的应用程序知道引用的程序集在 temp 文件夹中。
谢谢
【问题讨论】:
标签: c# .net-assembly
我如何告诉我的 .NET 应用程序在哪里寻找它需要的特定程序集(除了 GAC 或运行应用程序的文件夹)? 例如,我想将一个程序集放在用户的 Temp 文件夹中,并让我的应用程序知道引用的程序集在 temp 文件夹中。
谢谢
【问题讨论】:
标签: c# .net-assembly
有关所涉及的一些问题,请参阅此讨论:
http://bytes.com/topic/c-sharp/answers/248203-dynamic-assembly-loading
基本上,您无法更改应用程序库 appdomain 创建后。您必须将其指定为 在创建新配置之前进行配置,默认情况下对您没有帮助 应用程序域。
如果您要加载的程序集位于当前程序集下的目录中 appbase 然后您可以使用 AppendPrivatePath(relativePath),然后使用 Assembly.Load - 运行时 将为您探测子目录。这是最好/最简单的方法 处理它。
【讨论】:
System.Reflection.Assembly.LoadFrom(myFile);
http://msdn.microsoft.com/en-us/library/1009fa28.aspx
另一种选择是自己处理大会解决事件,就像在这个 StackOverflow 问题中一样:How to add folder to assembly search path at runtime in .NET?
【讨论】:
您可以使用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;
}
【讨论】:
string assemblyname = new AssemblyName(args.Name).Name; 而不是Split(',')。