非常に単純なカスタム コンパイラを作成しました。
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>
。何かがどこかに欠けているはずですが (using?)、標準のコンパイラで問題なくビルドされます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
、機能します。しかし、私は他のものでそれを行うことはできません。