【问题标题】:Looking for .NET Assembly in a different place [duplicate]在不同的地方寻找 .NET 程序集 [重复]
【发布时间】:2010-12-06 10:00:18
【问题描述】:

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

谢谢

【问题讨论】:

    标签: c# .net-assembly


    【解决方案1】:

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

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

    基本上,您无法更改应用程序库 appdomain 创建后。您必须将其指定为 在创建新配置之前进行配置,默认情况下对您没有帮助 应用程序域。

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

    【讨论】:

    • 谢谢,我不需要动态加载它。我在我的项目中引用程序集。但是当我部署该应用程序时,我希望应用程序知道引用的程序集将在临时文件夹中
    【解决方案2】:
    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?

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • here 所述,使用string assemblyname = new AssemblyName(args.Name).Name; 而不是Split(',')
      • 感谢您的建议。
      猜你喜欢
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      • 2013-03-30
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多