这个问题在这里已经有答案了:

如何告诉我的 .NET 应用程序在哪里查找它需要的特定程序集(除了 GAC 或应用程序运行的文件夹之外)?例如,我想将程序集放入用户的临时文件夹中,并让我的应用程序知道引用的程序集位于临时文件夹中。

谢谢

有帮助吗?

解决方案

你可以使用 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;
}

其他提示

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

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

基本上,您无法在创建AppDomain的Appbase。您必须在创建一个新的appdomain之前将其指定为配置的一部分,该新新型不会帮助您。

如果要加载的组件位于当前AppBase下方的目录中,则可以使用AppendPrivatePath(相对路径)添加其相对路径,然后使用assembly.load.load-运行时将为您探测子目录。这是处理它的最佳/最简单方法。

System.Reflection.Assembly.LoadFrom(myFile);

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

另一种选择是自己处理程序集解析事件,如以下 StackOverflow 问题所示: 如何在 .NET 运行时将文件夹添加到程序集搜索路径?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top