代码之家  ›  专栏  ›  技术社区  ›  Pete Michaud

在ASP.NET中从bin加载程序集

  •  10
  • Pete Michaud  · 技术社区  · 17 年前

    我有一个文件名,比如“foo.dll”,用于我知道在bin目录中的库。我想为它创建一个程序集对象。我试图从一个不是页面的类中实例化这个对象,所以我没有请求对象来获取路径。如何获取使用assembly.load()所需的路径?

    4 回复  |  直到 17 年前
        1
  •  15
  •   jrista    17 年前

    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在标准融合过程之外工作,并可能导致程序集被多次加载、从不安全的位置加载等程序集。Load执行“标准”加载,搜索标准程序集位置(如bin、gac等),并应用所有标准安全检查。

        2
  •  2
  •   DanDan    17 年前

    assembly.loadfile(…)是否工作?

        3
  •  1
  •   Rex M    17 年前

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

        4
  •  0
  •   HGMamaci    9 年前

    一个完整的例子,如果有用的话。资源是dll库(程序集)根目录下的文件夹

            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。 不要忘记将“构建操作”标记为每个资源文件的“嵌入资源”(在“属性”窗口中)。