我正在IIS 7上使用F#创建一个ASP.NET MVC应用程序。
当我尝试从浏览器运行它时,我遇到了一个包含以下内容的YSOD:
[ArgumentNullException:值不能 是空的。参数名称:字典]
System.Collections.Generic.Dictionary2..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>
有关纠正此错误的任何想法吗?
答案 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"