Web アプリでエラーが発生しています。完全なスタック トレースは一番下にありますが、例外メッセージは次のとおりです。
System.Web.HttpParseException (0x80004005): e:\inetpub\wwwroot\Application\Mycontrol.ascx(19): error CS1061: 'System.Collections.Generic.IList<MyClass>' does not contain a definition for 'ToArray' and no extension method 'ToArray' accepting a first argument of type 'System.Collections.Generic.IList<MyClass>' could be found (are you missing a using directive or an assembly reference?)
案の定、マークアップにはこのようなコードがあります
<%# MyList.ToArray() %>
また、ページの上部にインポートするインポート ディレクティブはありませんSystem.Linq
。したがって、例外がどこから来ているかはわかりますが、(従来の開発者スタイルでは) 私のマシンでは動作します! また、ソフトウェアがインストールされている他のすべてのサーバーでも機能します。
system.web/pages/namespaces 要素web.config
の使用が含まれていないことを再確認しました (また、applicationHost.config も確認しました)。どちら System.Linq
のファイルにも言及されていません。.Linq
編集#1
簡単なチェックとして、VisualStudio で新しい .Net 4 Web アプリケーションを作成しました。バニラ web.config はor
について言及していません。(私の applicationHost.config または machine.config ファイルも同様です)。System.Linq
System.Core.dll
この linq コードを Default.aspx に追加しました
<%= new[] {"harp", "plinth", "uncanny", "donkey"}.ToArray().Count() %>
Import ディレクティブを追加せずに。そして、画面に「4」が表示されました。これは、正しい linq コードが実行されていることを意味します。
したがって、どういうわけか System.Core.dll が参照として含まれており、System.Linq
このページのコンパイル中に名前空間がインポートされています (明らかに魔法のように!)
編集#2
私たちのサポート担当者は、追加することを報告しました
<%@ Import namespace="System.Linq" %>
間違ったページに移動すると、問題が修正されます。System.Linq
したがって、問題は名前空間が顧客のマシンに「自動的に」インポートされていないことに限定されており(私のマシンや他のすべてのマシンにあるように)、System.Core.dllが利用できないこととは何の関係もないと結論付けましたページのコンパイル。
私の質問は 2 つあります。なぜ私のマシンで動作するのか、なぜ顧客のマシンで失敗するのかを誰かが説明できますか。
System.Web.HttpParseException (0x80004005): e:\inetpub\wwwroot\Application\Mycontrol.ascx(19): error CS1061: 'System.Collections.Generic.IList<MyClass>' does not contain a definition for 'ToArray' and no extension method 'ToArray' accepting a first argument of type 'System.Collections.Generic.IList<MyClass>' could be found (are you missing a using directive or an assembly reference?) ---> System.Web.HttpCompileException (0x80004005): e:\inetpub\wwwroot\Application\Mycontrol.ascx(19): error CS1061: 'System.Collections.Generic.IList<MyClass>' does not contain a definition for 'ToArray' and no extension method 'ToArray' accepting a first argument of type 'System.Collections.Generic.IList<MyClass>' could be found (are you missing a using directive or an assembly reference?)
at System.Web.Compilation.BuildManager.PostProcessFoundBuildResult(BuildResult result, Boolean keyFromVPP, VirtualPath virtualPath)
at System.Web.Compilation.BuildManager.GetBuildResultFromCacheInternal(String cacheKey, Boolean keyFromVPP, VirtualPath virtualPath, Int64 hashCode, Boolean ensureIsUpToDate)
at System.Web.Compilation.BuildManager.GetVPathBuildResultFromCacheInternal(VirtualPath virtualPath, Boolean ensureIsUpToDate)
at System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate)
at System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate)
at System.Web.Compilation.BuildManager.GetVPathBuildResult(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean ensureIsUpToDate)
at System.Web.UI.BaseTemplateParser.GetReferencedType(VirtualPath virtualPath, Boolean allowNoCompile)
at System.Web.UI.BaseTemplateParser.GetUserControlType(VirtualPath virtualPath)
at System.Web.UI.MainTagNameToTypeMapper.ProcessUserControlRegistration(UserControlRegisterEntry ucRegisterEntry)
at System.Web.UI.BaseTemplateParser.ProcessDirective(String directiveName, IDictionary directive)
at System.Web.UI.TemplateParser.ParseStringInternal(String text, Encoding fileEncoding)
at System.Web.UI.TemplateParser.ProcessException(Exception ex)
at System.Web.UI.TemplateParser.ParseStringInternal(String text, Encoding fileEncoding)
at System.Web.UI.TemplateParser.ParseString(String text, VirtualPath virtualPath, Encoding fileEncoding)
at System.Web.UI.TemplateParser.ParseFile(String physicalPath, VirtualPath virtualPath)
at System.Web.UI.TemplateParser.Parse()
at System.Web.Compilation.BaseTemplateBuildProvider.get_CodeCompilerType()
at System.Web.Compilation.BuildProvider.GetCompilerTypeFromBuildProvider(BuildProvider buildProvider)
at System.Web.Compilation.BuildProvidersCompiler.ProcessBuildProviders()
at System.Web.Compilation.BuildProvidersCompiler.PerformBuild()
at System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath)
at System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate)
at System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate)
at System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean throwIfNotFound)
at System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(VirtualPath virtualPath, Type requiredBaseType, HttpContext context, Boolean allowCrossApp)
at System.Web.UI.PageHandlerFactory.GetHandlerHelper(HttpContext context, String requestType, VirtualPath virtualPath, String physicalPath)
at System.Web.HttpApplication.MapHttpHandler(HttpContext context, String requestType, VirtualPath path, String pathTranslated, Boolean useAppConfig)
at System.Web.HttpApplication.MapHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)