代码之家  ›  专栏  ›  技术社区  ›  statenjason

F#Asp。Net CodeDom提供者选项问题

  •  3
  • statenjason  · 技术社区  · 16 年前


    2..ctor(IDictionary

    系统。网状物。汇编。编译工具。CreateCodeDomProviderNonPublic(类型

    输出程序集名称)+127
    系统。网状物。汇编。BuildProviders编译器。进程构建提供者()
    系统。网状物。汇编。建筑经理。编译GlobalAsax()

    private static CodeDomProvider CreateCodeDomProviderWithPropertyOptions(Type codeDomProviderType)
    {
    IDictionary<string, string> providerOptions = new Dictionary<string, string>(GetProviderOptions(codeDomProviderType));
    //Snip
    }
    

    这让我相信,我在F#CodeDom的Web.config中指定的propertyOptions是不正确的。但是,如果我删除它们,我会收到同样的错误。

    <system.codedom>
     <compilers>
      <compiler language="F#;f#;fs;fsharp" extension=".fs" warningLevel="4" 
                type="Microsoft.FSharp.Compiler.CodeDom.FSharpAspNetCodeProvider, 
                      FSharp.Compiler.CodeDom">
        <providerOption name="CompilerVersion" value="v4.0"/>
        <providerOption name="WarnAsError" value="false"/>
      </compiler>
     </compilers>
    </system.codedom>
    

    3 回复  |  直到 16 年前
        1
  •  4
  •   Brian    16 年前

    这是ASP中的一个错误。NET在VS2010 Beta2中的应用(它已经修复,因此将在下一个版本中工作)。它会影响任何第三方CodeDOM提供商,我认为没有任何解决方法。

        2
  •  3
  •   statenjason    16 年前

    我找到了问题的原因。

    微软。FSharp。编译器。CodeDom。FSharpAspNetCodeProvider。FileExtension被硬编码为“fs”。

    的内部 System.CodeDom.Compiler.CodeDomCompilationConfiguration..ctor() 编译器信息是为每种允许的语言创建的。在此创建过程中找不到用于FSharp的CompilerInfo。

    internal CodeDomCompilationConfiguration()
    {
    this._compilerLanguages = new Hashtable(StringComparer.OrdinalIgnoreCase);
    this._compilerExtensions = new Hashtable(StringComparer.OrdinalIgnoreCase);
    this._allCompilerInfo = new ArrayList();
    CompilerParameters compilerParams = new CompilerParameters();
    compilerParams.WarningLevel = 4;
    string codeDomProviderTypeName = "Microsoft.CSharp.CSharpCodeProvider, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
    CompilerInfo compilerInfo = new CompilerInfo(compilerParams, codeDomProviderTypeName);
    compilerInfo._compilerLanguages = new string[] { "c#", "cs", "csharp" };
    compilerInfo._compilerExtensions = new string[] { ".cs", "cs" };
    compilerInfo._providerOptions = new Dictionary<string, string>();
    compilerInfo._providerOptions["CompilerVersion"] = "v4.0";
    this.AddCompilerInfo(compilerInfo);
    compilerParams = new CompilerParameters();
    compilerParams.WarningLevel = 4;
    codeDomProviderTypeName = "Microsoft.VisualBasic.VBCodeProvider, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
    compilerInfo = new CompilerInfo(compilerParams, codeDomProviderTypeName);
    compilerInfo._compilerLanguages = new string[] { "vb", "vbs", "visualbasic", "vbscript" };
    compilerInfo._compilerExtensions = new string[] { ".vb", "vb" };
    compilerInfo._providerOptions = new Dictionary<string, string>();
    compilerInfo._providerOptions["CompilerVersion"] = "v4.0";
    this.AddCompilerInfo(compilerInfo);
    //Snip
    }
    

    _compilerExtensions System.CodeDom.Compiler.CodeDomProvider.GetCompilerInfoForExtensionNoThrow 如果是“fs”,则返回null System.CodeDom.Compiler.CodeDomProvider.IsDefinedExtension System.Web.Compilation.CompilationUtil.GetProviderOptions 返回导致ArgumentNullException的null。

    谢谢你为我指明了正确的方向,@Brian

        3
  •  0
  •   Chris R. Timmons    16 年前

    type="Microsoft.FSharp.Compiler.CodeDom.FSharpAspNetCodeProvider, 
          FSharp.Compiler.CodeDom,
          Version=1.9.7.8, 
          Culture=neutral, 
          PublicKeyToken=a19089b1c74d0809"