Вы можете сделать это в проекте веб-сайта.
Есть статья MSDN об использовании флага -fixednames при компиляции проекта.
Это эффективно создает сборку для каждой страницы - default.aspx.dll.Тем не менее, это только немного более полезно для вас, так как вам все равно нужно знать имя элемента управления или страницы, которую вы ищете, когда вы загружаете - так что вы должны убедиться, что ваши типы и имена соответствуют.Однако он должен уважать имена классов в app_code, так что это может сработать для вас.
Еще одна вещь, которую вы можете сделать, это переместить весь код из app_code в его собственную сборку, а затем добавить этов качестве ссылки на проект.Это также упростило бы эту проблему.
Наконец, вы можете перечислить все библиотеки DLL в каталоге bin и найти каждый тип искомого типа.Поскольку это довольно дорого, сделайте это один раз и сохраните результат в кеше, чтобы вы не продолжали делать это каждый раз, когда просматриваете этот тип.Вероятно, это худшее решение.
Это тривиально в проекте WebApplication, но я полагаю, что вы застряли с сайтом WebSite?
РЕДАКТИРОВАТЬ: Какобновление для комментариев;если я использую Publish Web Tool, то весь код в app_code попадает в каталог bin в dll с именем App_Code.dll - это поведение не меняется, даже если я использую фиксированное именование (все фиксированные именования влияют на именование dll длякаждая страница, usercontrol).Если я использую ILSpy для этого файла, я могу видеть мои классы там.Итак, я знаю название сборки и ее местоположение - я должен быть в состоянии найти типы в ней с минимальными усилиями.Интересно, почему я вижу другое поведение для вас!
Я создал простой класс «Person» с идентификатором и именем, поместил его в App_Code, скомпилировал сайт, а затем запустил следующий код:
Type myType = Assembly.LoadFrom(Server.MapPath("~/bin/App_Code.dll")).GetType("Person", true);
Response.Write(myType.ToString());
В нем выписано «Лицо», как и ожидалось.
Далее Редактировать
Пенни падает!Если я затем сделаю:
object myObject= Activator.CreateInstance("App_Code.dll", "Person");
и попытаюсь привести myObject к человеку, я получу следующее сообщение:
The type 'Person' exists in both 'App_Code.dll' and 'App_Code.jydjsaaa.dll
'
Так что пришло время быть хитрым.
в Global.asax на Application_OnStart выполните следующее:
Application["App_Code_Assembly"] = Assembly.GetAssembly(typeof(Person));
На моей тестовой странице по умолчанию я сделал:
Assembly app_Code = Application["App_Code_Assembly"] as Assembly;
Response.Write(app_Code.FullName);
, что дало мнепроизвольно названный app_code, с которым он фактически работает во временных файлах ASP.Net.
Вот почему я ненавижу проекты веб-сайтов; -)