F # Asp.Net CodeDom ProviderOptions Проблема - PullRequest
3 голосов
/ 13 ноября 2009

Я создаю приложение ASP.NET MVC, используя F # на IIS 7.

Когда я пытаюсь запустить его из браузера, меня встречает YSOD, содержащий следующее:

[ArgumentNullException: значение не может быть нулевым Имя параметра: словарь]
System.Collections.Generic.Dictionary 2..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, Строка generateFilesDir, 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
}

Это заставляет меня полагать, что propertyOptions, которые я указал в моем Web.config для F # CodeDom, неверны. Однако, если я удаляю их, я получаю ту же ошибку.

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

Есть идеи по исправлению этой ошибки?

Ответы [ 3 ]

4 голосов
/ 13 ноября 2009

Это ошибка в ASP.NET в VS2010 Beta2 (с тех пор она была исправлена, поэтому будет работать в следующей версии). Это влияет на любого стороннего поставщика CodeDOM, и я не верю, что есть обходной путь.

3 голосов
/ 14 ноября 2009

Я нашел причину проблемы.

Microsoft.FSharp.Compiler.CodeDom.FSharpAspNetCodeProvider.FileExtension жестко закодировано в «fs».

Внутри System.CodeDom.Compiler.CodeDomCompilationConfiguration..ctor() CompilerInfos создаются для каждого из разрешенных языков. CompilerInfo для FSharp не найден при создании этого.

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, который (в случае "fs") возвращает ноль в System.CodeDom.Compiler.CodeDomProvider.IsDefinedExtension, который затем возвращает ложь в System.Web.Compilation.CompilationUtil.GetProviderOptions, который возвращает нуль, вызвавший ArgumentNullException.

Спасибо, что указал мне правильное направление, @ Брайан

0 голосов
/ 14 ноября 2009

Возможно, ошибку, замеченную Брайаном, можно обойти, указав дополнительную информацию в web.config:

type="Microsoft.FSharp.Compiler.CodeDom.FSharpAspNetCodeProvider, 
      FSharp.Compiler.CodeDom,
      Version=1.9.7.8, 
      Culture=neutral, 
      PublicKeyToken=a19089b1c74d0809"
...