0

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.LinqSystem.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)
4

0 に答える 0