【问题标题】:Load an Assembly from Bin in ASP.NET在 ASP.NET 中从 Bin 加载程序集
【发布时间】:2009-07-21 23:41:22
【问题描述】:

我有一个文件名,例如“Foo.dll”,我知道该库位于 bin 目录中。我想为它创建一个 Assembly 对象。我试图从一个不是页面的类中实例化这个对象,所以我没有 Request 对象来获取路径。如何获得使用 Assembly.Load() 所需的路径?

【问题讨论】:

    标签: c# asp.net vb.net dll


    【解决方案1】:

    Assembly.Load 不需要文件路径,而是需要 AssemblyName。如果您知道您的程序集位于标准搜索路径(即 bin 目录)中,则不需要知道程序集的磁盘路径……您只需要知道它的程序集名称。对于您的程序集,假设您不需要特定的版本、文化等,程序集名称应该只是“Foo”:

    Assembly fooAssembly = Assembly.Load("Foo");
    

    如果您确实需要加载特定版本,您可以执行以下操作:

    Assembly fooAssembly = Assembly.Load("Foo, Version=1.1.2, Culture=neutral");
    

    通常,您希望使用 Assembly.Load,而不是 Assembly.LoadFrom 或 Assembly.LoadFile。 LoadFrom 和 LoadFile 在标准融合过程之外工作,并可能导致程序集被多次加载、从不安全的位置加载等。Assembly.Load 执行“标准”加载,搜索标准程序集位置,例如 bin、GAC等,并应用所有标准安全检查。

    【讨论】:

    • 或者,如果您在该程序集中已经有一个类型的对象,您可以执行以下操作:obj.GetType().Assembly
    【解决方案2】:

    Assembly.LoadFile(...) 有效吗?

    【讨论】:

    • 呃,确定你是否知道绝对路径。我想这是问题的重要部分。
    【解决方案3】:

    根据您的描述,这听起来像是一个 Web 应用程序,因此除非您处于从请求产生的异步线程上,否则您应该仍然可以访问 HttpContext。从那里你可以使用Server.MapPath() 到你需要的文件。

    【讨论】:

      【解决方案4】:

      如果有帮助,请提供我使用的完整示例。 Resources是DLL库(Assembly)根目录下的一个文件夹

              public static string ReadAssemblyResourceFile(string resourcefilename)
              {
      using (var stream = Assembly.Load("GM.B2U.DAL").GetManifestResourceStream("GM.B2U.DAL.Resources."
          + resourcefilename))            {
                          if (stream == null) throw new MyExceptionDoNotLog($"GM.B2U.DAL.Resources.{resourcefilename} not found in the Assembly GM.B2U.DAL.dll !");
                          using (var reader = new StreamReader(stream))
                          {
                              return reader.ReadToEnd();
                          }           
                      }
              }
      

      调用函数:

      [TestMethod()]
      public void ReadAssemblyResourceFileTest()
      {
          var res = SetupEngine.ReadAssemblyResourceFile("newdb.sql");
          Assert.IsNotNull(res);
      }
      

      ps.不要忘记将每个资源文件的“构建操作”标记为“嵌入式资源”(在属性窗口中)。

      【讨论】:

        猜你喜欢
        • 2010-11-07
        • 2023-03-25
        • 2010-11-02
        • 1970-01-01
        • 2010-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多