Загрузить сборку из бина в ASP.NET - PullRequest
10 голосов
/ 22 июля 2009

У меня есть имя файла, например "Foo.dll", для библиотеки, которая, как я знаю, находится в каталоге bin. Я хочу создать объект Assembly для него. Я пытаюсь создать экземпляр этого объекта из класса, который не является страницей, поэтому у меня нет объекта Request для получения пути. Как получить путь, который мне нужен для использования Assembly.Load ()?

Ответы [ 4 ]

15 голосов
/ 22 июля 2009

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 голосов
/ 22 июля 2009

Работает ли Assembly.LoadFile (...)?

1 голос
/ 22 июля 2009

По вашему описанию это выглядит как веб-приложение, поэтому, если вы не находитесь в асинхронном потоке, созданном вами из запроса, вы все равно должны иметь доступ к HttpContext. Оттуда вы можете использовать Server.MapPath () для нужного вам файла.

0 голосов
/ 08 марта 2017

Полный пример, как я использую, если это поможет. Ресурсы - это папка под корнем библиотеки 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» как «Встроенный ресурс» (в окне свойств) каждого файла ресурсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...