F#Asp.Net CodeDom ProviderOptions问题

时间:2009-11-13 20:16:26

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

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

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

  

[ArgumentNullException:值不能   是空的。参数名称:字典]
  System.Collections.Generic.Dictionary 2..ctor(IDictionary 2   字典,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   referencedAssemblies,CompilerType   compilerType,String   outputAssemblyName)+469
  System.Web.Compilation.CompilerType.CreateAssemblyBuilder(CompilationSection   compConfig,ICollection   referencedAssemblies,String   generatedFilesDir,String   outputAssemblyName)+127
  System.Web.Compilation.BuildProvidersCompiler.ProcessBuildProviders()   +675 System.Web.Compilation.BuildProvidersCompiler.PerformBuild()   +46 System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult(Boolean   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>

有关纠正此错误的任何想法吗?

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

我找到了问题的原因。

Microsoft.FSharp.Compiler.CodeDom.FSharpAspNetCodeProvider.FileExtension硬编码为“fs”。

System.CodeDom.Compiler.CodeDomCompilationConfiguration..ctor()内部为每个允许的语言创建CompilerInfos。在创建此文件时找不到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与_compilerExtensions中的System.CodeDom.Compiler.CodeDomProvider.GetCompilerInfoForExtensionNoThrow进行比较,System.CodeDom.Compiler.CodeDomProvider.IsDefinedExtension(在“fs”的情况下)将null返回System.Web.Compilation.CompilationUtil.GetProviderOptions,然后返回false返回{{1}}返回导致ArgumentNullException的null。

感谢你指点我正确的方向,@布莱恩

答案 2 :(得分:0)

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

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