【发布时间】:2009-07-21 23:41:22
【问题描述】:
我有一个文件名,例如“Foo.dll”,我知道该库位于 bin 目录中。我想为它创建一个 Assembly 对象。我试图从一个不是页面的类中实例化这个对象,所以我没有 Request 对象来获取路径。如何获得使用 Assembly.Load() 所需的路径?
【问题讨论】:
我有一个文件名,例如“Foo.dll”,我知道该库位于 bin 目录中。我想为它创建一个 Assembly 对象。我试图从一个不是页面的类中实例化这个对象,所以我没有 Request 对象来获取路径。如何获得使用 Assembly.Load() 所需的路径?
【问题讨论】:
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等,并应用所有标准安全检查。
【讨论】:
Assembly.LoadFile(...) 有效吗?
【讨论】:
根据您的描述,这听起来像是一个 Web 应用程序,因此除非您处于从请求产生的异步线程上,否则您应该仍然可以访问 HttpContext。从那里你可以使用Server.MapPath() 到你需要的文件。
【讨论】:
如果有帮助,请提供我使用的完整示例。 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.不要忘记将每个资源文件的“构建操作”标记为“嵌入式资源”(在属性窗口中)。
【讨论】: