2009-07-21 73 views
10

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

回答

15

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执行“标准”加载,搜索标准汇编位置,例如bin,GAC等等,并应用所有的标准安全检查。

+2

或者,如果您已经在该程序集中有一个类型的对象 您可以执行如下操作:obj.GetType()。Assembly – 2009-07-22 08:41:17

2

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

+0

呃,当然如果你知道绝对路径。我想这是问题的重要部分。 – 2009-07-22 01:47:43

1

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

0

我使用的一个完整示例,如果有帮助的话。资源是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。不要忘记将“Build Action”标记为每个资源文件的“Embedded Resource”(在属性窗口中)。