asp.net - 为动态编译的 ASP.NET 网站的 App_Code 文件夹提供显式程序集名称?

标签 asp.net .net-assembly web-site-project runtime-compilation

在动态编译的 ASP.NET 网站项目中,是否可以显式命名 App_Code 文件夹的程序集?

例如,在正常情况下,当我运行 ASP.NET 网站时,生成到 Temporary ASP.NET Files\ 文件夹中的程序集名称是部分随机的,如 App_Code.neizakfo.dll 其中 neizakfo 是可能不同的部分。我可以显式提供程序集的名称,例如 App_Code_Web1.dll 吗?

澄清

由于业务需求,网站无法预编译/部署。因此,我正在 Temporary ASP.NET Files 文件夹和动态编译的程序集的上下文中寻找解决方案,如上所述。

<小时/>

背景:
我在寻找一种方法使用存储在配置中的程序集限定名称对网站的 App_Code 文件夹中的类执行动态类型实例化时遇到了这个问题,但从网页实例化,从而跨越了程序集边界。由于网页和 app_code 代码默认编译为两个不同的程序集,因此 Type.GetType(..) 方法在当前执行程序集(网页)或 mscorlib 中搜索类型名称的默认行为不会发生变化。足以从 App_Code 程序集中选取任何类型。由于是随机的,我不知道 app_code 程序集名称是否包含在程序集限定字符串中。

我可以将数据类型放入类库中(因为它有一个预定义/确切的名称)来解决这个问题,但是我想知道如何在网站本身内部执行此操作而不创建类为此目的的图书馆项目。

最佳答案

您可以在网站项目中执行此操作。

有一个 MSDN article on using the -fixednames flag编译项目时。

这有效地为每个页面创建了一个程序集 - default.aspx.dll。然而,这对您来说只是稍微有用一点,因为您仍然需要知道加载时要查找的控件或页面的名称 - 因此您必须确保您的类型和命名是一致的。但是,它应该尊重 app_code 中类的名称,因此这可能对您有用。

您可以做的另一件事是将 app_code 中的所有代码移出到它自己的程序集中,然后将其添加为项目引用。这也会简化这个问题。

最后,您可以枚举 bin 目录中的所有 dll,并在每个 dll 中搜索您要查找的类型。由于这相当昂贵,因此执行一次,并将结果缓存在某个地方,这样您就不必每次查找该类型时都继续执行此操作。这可能是最糟糕的解决方案。

这在 WebApplication 项目中是微不足道的,但我假设您被 WebSite 项目困住了?

编辑:作为评论的更新;如果我使用发布 Web 工具,那么 app_code 中的所有代码都会进入名为 App_Code.dll 的 dll 中的 bin 目录 - 即使我使用固定命名,此行为也不会改变(所有固定命名都会影响 dll 的命名)每个页面,用户控件)。如果我使用ILSpy在此文件上,我可以在那里看到我的类(class)。所以我知道程序集的名称及其位置 - 我应该能够以最小的努力获取其中的类型。我想知道为什么我看到的行为与你不同!

我创建了一个名为“Person”的简单类,其中包含 ID 和名称,将其放入 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,我收到以下消息:

类型“Person”同时存在于“App_Code.dll”和“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。

这就是我讨厌网站项目的原因;-)

关于asp.net - 为动态编译的 ASP.NET 网站的 App_Code 文件夹提供显式程序集名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9520231/

相关文章:

c# - 如何在某些情况下在后面的代码中禁用整个页面?

c# - 将间接依赖项添加到输出

.net - .NET 程序集中的嵌入式资源是在运行时从磁盘加载还是从内存加载?

javascript - 将 Html/Css/JS 导入 CMS?

html - 将搜索框从旧网站转移到新网站

asp.net - 公司 IT 系统方向。投资A还是B?

c# - 从服务器端线程更新面板

c# - ASP :button Return behaviour

c# - 找不到 Visual Studio 页面检查程序集

asp.net - 如何管理 ASP.NET 网站项目中的多个 web.config 文件?