Загрузите сборку из Bin в ASP.NET

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

Ответ 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" (в окне свойств) каждого файла ресурсов.