Pregunta

Estoy creando una aplicación ASP.NET MVC usando F # en IIS 7.

Cuando intento ejecutar desde el navegador, me encontré con un YSOD que contiene lo siguiente:

  

[ArgumentNullException: El valor no puede   ser nulo. Nombre de parámetro: diccionario]
  System.Collections.Generic.Dictionary2..ctor(IDictionary2   diccionario, IEqualityComparer`1   comparador) +12700827
  System.Web.Compilation.CompilationUtil.CreateCodeDomProviderWithPropertyOptions (Tipo   codeDomProviderType) 84
  System.Web.Compilation.CompilationUtil.CreateCodeDomProviderNonPublic (Tipo   codeDomProviderType) 16
  System.Web.Compilation.AssemblyBuilder..ctor (CompilationSection   compConfig, ICollection   referencedAssemblies, CompilerType   compilerType, Cadena   outputAssemblyName) 469
  System.Web.Compilation.CompilerType.CreateAssemblyBuilder (CompilationSection   compConfig, ICollection   referencedAssemblies, Cadena   generatedFilesDir, Cadena   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

Miré hacia arriba usando el método del reflector para ver si me podía dar más contexto y se encontró que estaba fallando en la primera línea

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

Me lleva a pensar que los propertyOptions he especificado en mi Web.config para el F # CodeDom son incorrectos. Sin embargo, si yo les quito recibo el mismo error.

<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>

¿Alguna idea sobre cómo corregir este error?

¿Fue útil?

Solución 2

He encontrado la causa del problema.

El Microsoft.FSharp.Compiler.CodeDom.FSharpAspNetCodeProvider.FileExtension está codificado a "FS".

Dentro de CompilerInfos System.CodeDom.Compiler.CodeDomCompilationConfiguration..ctor() se crean para cada uno de los idiomas permitidos. Un CompilerInfo para FSharp no se encuentra dentro de la creación de este.

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
}

El FileExtension se compara contra _compilerExtensions en System.CodeDom.Compiler.CodeDomProvider.GetCompilerInfoForExtensionNoThrow que (en el caso de "FS") devuelve un valor nulo a System.CodeDom.Compiler.CodeDomProvider.IsDefinedExtension que luego volver falsa a System.Web.Compilation.CompilationUtil.GetProviderOptions que devuelve el nula de que estaba causando el ArgumentNullException.

Gracias por señalarme en la dirección correcta, @ Brian

Otros consejos

Es un error en ASP.NET en VS2010 Beta2 (que ya ha sido fijada, por lo que trabajará en la próxima versión). Afecta a cualquier tercero proveedor de CodeDOM partido, y no creo que hay alguna solución.

Tal vez el error de Brian observó se puede evitar mediante la especificación de un poco más de información en web.config:

type="Microsoft.FSharp.Compiler.CodeDom.FSharpAspNetCodeProvider, 
      FSharp.Compiler.CodeDom,
      Version=1.9.7.8, 
      Culture=neutral, 
      PublicKeyToken=a19089b1c74d0809"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top