您可以在网站项目中执行此操作。
有一篇关于在编译项目时使用 -fixednames 标志的 MSDN 文章。
这有效地为每个页面创建了一个程序集 - default.aspx.dll。但是,这对您来说只是稍微有用一点,因为您在加载时仍然需要知道要查找的控件或页面的名称 - 因此您必须确保您的类型和命名是一致的。但是,它应该尊重 app_code 中类的名称,因此这可能对您有用。
您可以做的另一件事是将 app_code 中的所有代码移出到它自己的程序集中,然后将其添加为项目引用。这也将简化这个问题。
最后,您可以枚举 bin 目录中的所有 dll,并在每个 dll 中搜索您要查找的类型。由于这相当昂贵,因此只做一次,然后将结果缓存在某处,这样就不必每次查找该类型时都继续这样做。这可能是最糟糕的解决方案。
这在 WebApplication 项目中是微不足道的,但我假设你被 WebSite 困住了?
编辑:作为评论的更新;如果我使用 Publish Web Tool,那么 app_code 中的所有代码都会进入名为 App_Code.dll 的 dll 中的 bin 目录中 - 即使我使用固定命名,这种行为也不会改变(所有固定命名都会影响 dll 的命名)每个页面,用户控件)。如果我在这个文件上使用ILSpy,我可以在那里看到我的类。所以我知道程序集的名称和位置——我应该能够以最小的努力获得其中的类型。我想知道为什么我看到你的行为不同!
我用 Id 和 Name 创建了一个名为“Person”的简单类,将其放入 App_Code,编译站点,然后运行以下代码:
Type myType = Assembly.LoadFrom(Server.MapPath("~/bin/App_Code.dll")).GetType("Person", true);
Response.Write(myType.ToString());
正如预期的那样,它写出了“Person”。
进一步编辑
一分钱掉了!如果我这样做:
object myObject= Activator.CreateInstance("App_Code.dll", "Person");
并尝试将 myObject 转换为 person,我收到以下消息:
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);
这给了我在临时 ASP.Net 文件中实际运行的随机命名的 app_code。
这就是我讨厌网站项目的原因 ;-)