F # Asp.Net CodeDom ProviderOptions Edizione
-
20-09-2019 - |
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(IDictionary
2 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?
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"