3

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

例如,在正常情况下,当我运行 ASP.NET 网站时,生成到Temporary ASP.NET Files\文件夹中的程序集名称是部分随机的,就像 neizakfoApp_Code.neizakfo.dll是可以不同的部分一样。我可以明确地为程序集提供一个名称吗?App_Code_Web1.dll

澄清

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


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

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

4

1 回答 1

4

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

有一篇关于在编译项目时使用 -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。

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

于 2012-03-01T17:16:10.380 回答