从斌在ASP.NET加载程序集(Load an Assembly from Bin in ASP.N

2019-07-30 13:45发布

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

Answer 1:

Assembly.Load不应该要求一个文件路径,而它需要的AssemblyName。 如果你知道你的组件在标准的搜索路径(即bin目录下),你不应该需要知道组件的磁盘路径...你只需要知道它的程序集名称。 在你的组件的情况下,假设你并不需要一个特定的版本,文化等等,集名称应该仅仅是“富”:

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执行“标准”负载,搜索的标准装配位置,诸如纸槽,GAC等,并适用所有标准的安全检查。



Answer 2:

是否Assembly.LoadFile(...)工作?



Answer 3:

从你的描述听起来这是一个Web应用程序,所以,除非你是在你的要求催生了一个异步线程,你应该还是可以访问HttpContext 。 从那里,你可以使用使用Server.Mappath()到你需要的文件。



Answer 4:

一个完整的例子,因为我用,如果有帮助。 资源是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。 不要忘了“建设行动”,以纪念为每个资源文件“嵌入的资源”(在属性窗口)。



文章来源: Load an Assembly from Bin in ASP.NET