【发布时间】:2012-11-19 17:01:06
【问题描述】:
我创建了一个非常简单的自定义编译器:
public class SimpleCompiler : CSharpCodeProvider
{
public SimpleCompiler() : base()
{
File.AppendText("d:\foo.txt","bar");
}
}
在我的 web.config 文件中,我复制/粘贴了现有配置来声明这个新的编译器。
<compiler language="c#;cs;csharp" extension=".cs" type="XXX.SimpleCompiler, XXX" warningLevel="4">
<providerOption name="CompilerVersion" value="v3.5"/>
<providerOption name="WarnAsError" value="false"/>
</compiler>
但在使用以下代码访问用户控件时出现错误:
<asp:Label runat="server" ID="Label3">
<%#
string.Join("<br/>",((ReadOnlyCollection<AAA>)Eval("ListOfAs")).Select(x => x.Name).ToArray())
%>
</asp:Label>
在> 或<AAA> 上失败。某处应该缺少某些东西(使用?),但是使用标准编译器 Microsoft.CSharp.CSharpCodeProvider 可以很好地构建。
错误信息是:
编译器错误消息:CS1525:无效的表达式术语'>'
更新: 好像和LINQ有关。它在控制代码中使用 LINQ 的所有页面上都失败。但是 System.Core.dll 包含在 Web.config 中。
Update2:我能够在一个新的 Web 应用程序项目中重现它。
-
添加一个新类:
namespace WebApplication1 { public class SimpleCompiler : CSharpCodeProvider { private void Log(string message) { File.AppendAllText("d:\\foo.txt", DateTime.Now.Ticks+Environment.NewLine); } }}
-
更新
web.config<system.codedom> <compilers> <compiler language="c#;cs;csharp" extension=".cs" warningLevel="4" type="WebApplication1.SimpleCompiler, WebApplication1"> <providerOption name="CompilerVersion" value="v3.5"/> <providerOption name="WarnAsError" value="false"/> </compiler> </compilers> </system.codedom> -
将
Default.aspx更改为:<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %> <%@ Import Namespace="System.Linq" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"></head> <body> <form id="form1" runat="server"> <div> <% int x = (new int[] { 1, 2, 3, 4, 5 }).Where(z => z > 2).Count(); this.Response.Write(x); %> </div> </form> </body> </html>
如果我将项目更新为4.0,它可以工作。但我不能在其他人中这样做。
【问题讨论】:
-
你确定它没有在
x => x ...附近失败吗? -
您是从 .NET 2 引用 CSharpCodeProvider 吗?
-
你能否在不使用的情况下使用 ASP.NET,例如从一个简单的控制台应用程序?
-
如果我使用“默认”编译器,代码工作正常,因此我很确定
x => x没问题。我正在使用.NET 3.5。但我不知道如何在 Asp.NET 之外对其进行测试:大多数页面构建良好,只有这样的代码被破坏。 -
@SimonMourier,DLL 信息:
Assembly System.dll, v2.0.50727
标签: c# asp.net linq web-config csharpcodeprovider