1

非常に単純なカスタム コンパイラを作成しました。

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 アプリケーション プロジェクトで再現できました。

  1. 新しいクラスを追加します。

    namespace WebApplication1
    {
        public class SimpleCompiler : CSharpCodeProvider
        {
            private void Log(string message)
            {
                File.AppendAllText("d:\\foo.txt", DateTime.Now.Ticks+Environment.NewLine);
            } 
       }
    

    }

  2. アップデート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>
    
  3. 変更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、機能します。しかし、私は他のものでそれを行うことはできません。

4

1 に答える 1

0

Web.config に追加してみてください:

<pages>
   <namespaces>
      <add namespace="System.Linq" />
   </namespaces>
</pages>

<compilation>
    <assemblies>
        <add assembly="System.Core" />
    </assemblies>
</compilation>
于 2012-11-21T02:14:08.607 に答える