【问题标题】:F# Asp.Net CodeDom ProviderOptions IssueF# Asp.Net CodeDom ProviderOptions 问题
【发布时间】:2009-11-13 20:16:25
【问题描述】:

我正在 IIS 7 上使用 F# 创建一个 ASP.NET MVC 应用程序。

当我尝试从浏览器运行它时,我遇到了一个包含以下内容的 YSOD:

[ArgumentNullException: 值不能 为空。参数名称:字典]
System.Collections.Generic.Dictionary2..ctor(IDictionary2 字典,IEqualityComparer`1 比较器)+12700827
System.Web.Compilation.CompilationUtil.CreateCodeDomProviderWithPropertyOptions(类型 codeDomProviderType) +84
System.Web.Compilation.CompilationUtil.CreateCodeDomProviderNonPublic(类型 codeDomProviderType) +16
System.Web.Compilation.AssemblyBuilder..ctor(CompilationSection compConfig,ICollection 引用的程序集,编译器类型 编译器类型,字符串 outputAssemblyName) +469
System.Web.Compilation.CompilerType.CreateAssemblyBuilder(CompilationSection compConfig,ICollection 引用的程序集,字符串 生成文件目录,字符串 outputAssemblyName) +127
System.Web.Compilation.BuildProvidersCompiler.ProcessBuildProviders() +675 System.Web.Compilation.BuildProvidersCompiler.PerformBuild() +46 System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult(布尔 isPrecompiledApp) +11321455
System.Web.Compilation.BuildManager.CompileGlobalAsax() +50 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled() +872

我使用 Reflector 查找了该方法,看看它是否可以为我提供更多上下文,发现它在第一行就失败了

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

这让我相信我在 Web.config 中为 F# CodeDom 指定的 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>

对纠正这个错误有什么想法吗?

【问题讨论】:

    标签: asp.net-mvc model-view-controller iis f# codedom


    【解决方案1】:

    这是 VS2010 Beta2 中 ASP.NET 中的一个错误(现已修复,因此将在下一个版本中使用)。它会影响任何 3rd 方 CodeDOM 提供程序,我不相信有任何解决方法。

    【讨论】:

    • 有关于这个错误的文档吗?
    • 我只有微软的内部电子邮件/错误信息,不知道是否有例如一个面向公众的 Connect 错误。我确实发现了一些对话,说提供“CodeDomProvider.FileExtension”可能会解决它。我对 ASP.Net 几乎一无所知,但也许这对你来说意味着什么?
    • 感谢您提及 FileExtension。我做了一些挖掘,发现可用的文件扩展名是硬编码的,不包括“fs”。我已经在我的回答中进行了更详细的解释。
    【解决方案2】:

    我找到了问题的原因。

    Microsoft.FSharp.Compiler.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
    }
    

    FileExtension 与System.CodeDom.Compiler.CodeDomProvider.GetCompilerInfoForExtensionNoThrow 中的_compilerExtensions 进行比较,System.CodeDom.Compiler.CodeDomProvider.GetCompilerInfoForExtensionNoThrow(在“fs”的情况下)将 null 返回到 System.CodeDom.Compiler.CodeDomProvider.IsDefinedExtension,然后将返回 false 到 System.Web.Compilation.CompilationUtil.GetProviderOptions,返回导致 ArgumentNullException 的 null。

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

    【讨论】:

    • 虽然我确信有一种方法可以解决硬编码扩展的疯狂问题。
    【解决方案3】:

    也许 Brian 指出的错误可以通过在 web.config 中指定更多信息来解决:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多