У меня есть имя файла, например "Foo.dll", для библиотеки, которую я знаю, находится в каталоге bin. Я хочу создать для него объект Assembly. Я пытаюсь создать экземпляр этого объекта из класса, который не является страницей, поэтому у меня нет объекта Request для получения пути. Как мне получить путь, который мне нужен, чтобы использовать Assembly.Load()?
Загрузите сборку из Bin в ASP.NET
Ответ 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 и т.д., и применяет все стандартные проверки безопасности.
Ответ 2
Работает ли Assembly.LoadFile(...)?
Ответ 3
Из вашего описания это похоже, что это веб-приложение, поэтому, если вы не используете асинхронный поток, который вы породили из запроса, вы все равно должны иметь доступ к HttpContext
. Оттуда вы можете использовать Server.MapPath() в нужном файле.
Ответ 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. Не забудьте отметить "Build Action" как "Embedded Resource" (в окне свойств) каждого файла ресурсов.