Отражающие сборки в IIS7 - PullRequest
       2

Отражающие сборки в IIS7

0 голосов
/ 10 ноября 2011

У меня есть приложение, в котором я использую отражение для вызова методов, которые представляют собой разные классы, созданные с помощью NetTiers.

Для этого я загружаю сборку служб NetTiers, получая ExecutingСборка с использованием:

Assembly.GetExecutingAssembly().CodeBase

и загрузка класса с помощью:

Assembly.LoadFrom(<Assembly Path using above>.dll).GetType(<className>)

Иногда кажется, что это работает, однако иногда загрузка сборки завершается неудачей со следующим исключением:

Ошибка загрузки сборки из выполнения: C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Временные файлы ASP.NET \ services \ 21d6c367 \ aa208bcd \ Assembly \ dl3 \ e825b934 \ 00f26fab_a39ecc01 \ .dllкласс:

и трассировка стека:

System.IO.FileNotFoundException: не удалось загрузить файл или сборку 'file: /// C: \ Windows \ Microsoft.NET\ Framework64 \ v4.0.30319 \ Временные файлы ASP.NET \ services \ 21d6c367 \ aa208bcd \ assembly \ dl3 \ e825b934 \ 00f26fab_a39ecc01 \ .dll 'или одна из ее зависимостей.Система не может найти указанный файл.Имя файла: 'file: /// C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Временные файлы ASP.NET \ services \ 21d6c367 \ aa208bcd \ Assembly \ dl3 \ e825b934 \ 00f26fab_a39ecc01 \ .dll'

в System.Reflection.RuntimeAssembly._nLoad (имя_файла AssemblyName, строка кода базы, свидетельство AssemblySecurity, RuntimeAssembly locationHint, StackCrawlMark & ​​stackMark, логическое значение throwOnFileNotFound, логическое значение для присваивания, присваивающее_обрабатывающее_применение, StackCrawlMark & ​​stackMark, логическое значение forIntrospection, логическое значение suppressSecurityChecks)

в System.Reflection.RuntimeAssembly.InternalLoadFrom (строковый сборочный файл, Evidence securityEvidence, байтное значение*

в System.Reflection.Assembly.LoadFrom (String assemblyFile)

WRN: ведение журнала привязки сборкивыключен.Чтобы включить ведение журнала ошибок привязки сборки, установите для параметра реестра [HKLM \ Software \ Microsoft \ Fusion! EnableLog] (DWORD) значение 1. Примечание. С журналированием ошибок привязки сборки связано некоторое снижение производительности.Чтобы отключить эту функцию, удалите значение реестра [HKLM \ Software \ Microsoft \ Fusion! EnableLog].

Есть ли лучший способ загрузить классы из сборок, или я пропускаю что-то, что приводит к этой ошибке для некоторых классов, но не для других?Я запускаю приложение, используя IIS7.

Ответы [ 2 ]

1 голос
/ 11 ноября 2011

Попробуйте использовать

Assembly.Load(Assembly.GetExecutingAssembly().GetName())

Для загрузки сборки.

Однако я считаю, что GetExecutingAssembly не обязательно надежен из-за JIT-встраивания и т. Д .; по тем же причинам, что и GetCallingAssembly. GetEntryAssembly, вероятно, лучше - но в веб-приложении это, вероятно, будет другая динамически сгенерированная сборка благодаря Global.asax - то есть она не обязательно будет содержать какой-либо ваш код напрямую.

Действительно, было бы намного лучше, если бы вы заранее знали хотя бы имя сборки - и тогда вы можете использовать метод Assembly.Load(AssemblyName), как описано выше, не беспокоясь о имени файла (загрузка по имени файла не всегда хорошая идея - вы можете получить дубликаты сборок в памяти, если загружаете их из места, отличного от того, где загружалась бы среда выполнения.

0 голосов
/ 10 ноября 2011

из указанного пути вы можете видеть, что вы не указали имя для dll, см. \.dll

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