Domanda

Sto creando un'applicazione ASP.NET MVC utilizzando F # su IIS 7.

Quando si tenta di eseguirlo dal browser, sto incontrato un YSOD contenente quanto segue:

  

[ArgumentNullException: valore non può   essere nullo. Nome del parametro: dizionario]
  System.Collections.Generic.Dictionary2..ctor(IDictionary2   dizionario, IEqualityComparer`1   di confronto) +12700827
  System.Web.Compilation.CompilationUtil.CreateCodeDomProviderWithPropertyOptions (Type   codeDomProviderType) +84
  System.Web.Compilation.CompilationUtil.CreateCodeDomProviderNonPublic (Type   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 (booleano   isPrecompiledApp) +11321455
  System.Web.Compilation.BuildManager.CompileGlobalAsax ()   +50 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled ()   872

Ho guardato il metodo utilizzando Reflector per vedere se mi poteva dare più contesto e ha scoperto che stava venendo a mancare nella prima riga

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

E mi porta a credere che le propertyOptions ho specificato nel mio web.config per l'F # CodeDom non sono corretti. Tuttavia, se li rimuovo ricevo lo stesso errore.

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

Tutte le idee su come correggere questo errore?

È stato utile?

Soluzione 2

Ho trovato la causa del problema.

Il Microsoft.FSharp.Compiler.CodeDom.FSharpAspNetCodeProvider.FileExtension è hardcoded per "FS".

All'interno di CompilerInfos System.CodeDom.Compiler.CodeDomCompilationConfiguration..ctor() vengono creati per ciascuna delle lingue consentite. Un CompilerInfo per FSharp non si trova all'interno della creazione di questo.

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
}

Il FileExtension viene confrontato _compilerExtensions in cui System.CodeDom.Compiler.CodeDomProvider.GetCompilerInfoForExtensionNoThrow (nel caso di "fs") restituisce null per System.CodeDom.Compiler.CodeDomProvider.IsDefinedExtension che poi restituire falso System.Web.Compilation.CompilationUtil.GetProviderOptions che restituisce il nulla che stava causando l'ArgumentNullException.

Grazie per avermi nella giusta direzione, @ Brian

Altri suggerimenti

E 'un bug in ASP.NET in VS2010 Beta2 (da allora è stato fissato, in modo da funziona in prossima release). Colpisce qualsiasi terzo fornitore di parti CodeDOM, e io non credo che ci sia alcuna soluzione.

Forse il bug Brian ha osservato può essere lavorato intorno specificando qualche informazione in più nel web.config:

type="Microsoft.FSharp.Compiler.CodeDom.FSharpAspNetCodeProvider, 
      FSharp.Compiler.CodeDom,
      Version=1.9.7.8, 
      Culture=neutral, 
      PublicKeyToken=a19089b1c74d0809"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top