3

IIS 7でF#を使用してASP.NETMVCアプリケーションを作成しています。

ブラウザから実行しようとすると、次の内容を含むYSODが表示されます。

[ArgumentNullException:値をnullにすることはできません。パラメータ名:dictionary]
System.Collections.Generic.Dictionary 2..ctor(IDictionary2辞書、IEqualityComparer`1比較子)+12700827
System.Web.Compilation.CompilationUtil.CreateCodeDomProviderWithPropertyOptions(Type codeDomProviderType)+84
System.Web.Compilation.CompilationUtil.CreateCodeDomProviderNonPublic(Type codeDomProviderType) +16
System.Web.Compilation.AssemblyBuilder..ctor(CompilationSection compConfig、ICollectionreferencedAssemblies、CompilerTypecompilerType、String outputAssemblyName)+469
System.Web.Compilation.CompilerType.CreateAssemblyBuilder(CompilationSection compConfig、ICollectionreferencedAssemblies、StringgeneratedFilesDir、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>

このエラーを修正するためのアイデアはありますか?

4

3 に答える 3

4

これは、VS2010 Beta2のASP.NETのバグです(その後修正されているため、次のリリースで機能します)。これはサードパーティのCodeDOMプロバイダーに影響し、回避策はないと思います。

于 2009-11-13T20:51:56.177 に答える
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は、( "fs"の場合)nullを返し、次にfalseを返し、ArgumentNullExceptionを引き起こしていたnullを返す場合と比較_compilerExtensionsされます。System.CodeDom.Compiler.CodeDomProvider.GetCompilerInfoForExtensionNoThrowSystem.CodeDom.Compiler.CodeDomProvider.IsDefinedExtensionSystem.Web.Compilation.CompilationUtil.GetProviderOptions

私を正しい方向に向けてくれてありがとう、@ Brian

于 2009-11-13T21:47:10.140 に答える
0

おそらく、ブライアンが指摘したバグは、web.configでさらに情報を指定することで回避できます。

type="Microsoft.FSharp.Compiler.CodeDom.FSharpAspNetCodeProvider, 
      FSharp.Compiler.CodeDom,
      Version=1.9.7.8, 
      Culture=neutral, 
      PublicKeyToken=a19089b1c74d0809"
于 2009-11-13T21:01:28.730 に答える