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

例如,在正常情况下,当我运行一个ASP.NET 网站生成的程序集名称 Temporary ASP.NET Files\ 文件夹部分随机化,如 App_Code.neizakfo.dll 哪里 内扎克福 是可以不同的部分。我可以显式地为程序集提供一个名称,如 App_Code_Web1.dll?

澄清

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


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

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

有帮助吗?

解决方案

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

有一个 MSDN关于使用-fixednames标志的文章 编译项目时。

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

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

最后,您可以枚举bin目录中的所有dll,并搜索每个dll以查找您要查找的类型。因为这是相当昂贵的,做一次,并将结果缓存在某个地方,这样你就不会每次看到那个类型时都继续这样做。这可能是最糟糕的解决方案。

这在WebApplication项目中是微不足道的,但我假设你被网站卡住了?

编辑: 作为评论的更新;如果我使用发布Web工具,那么app_code中的所有代码都放在名为App_Code的dll中的bin目录中。dll-即使我使用固定命名(所有固定命名都影响每个页面的dll的命名,usercontrol),这种行为也不会改变。如果我使用 伊尔斯皮 在这个文件上,我可以在那里看到我的类。所以我知道程序集的名称,它的位置-我应该能够以最小的努力获得其中的类型。我不知道为什么我看到不同的行为给你!

我创建了一个名为"Person"的简单类,带有Id和名称,将其放入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转换为person,我收到以下消息:

The type 'Person' exists in both 'App_Code.dll' and 'App_Code.jydjsaaa.dll'

所以是时候狡猾了。

在全球。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 文件。

这就是为什么我讨厌网站项目;-)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top