CS2000: инициализация компилятора неожиданно завершилась неудачей - PullRequest
1 голос
/ 28 мая 2009

У меня есть приложение WPF .NET 3.5 SP1, которое на данный момент используется как минимум на сотнях, если не тысячах машин. Приложение хранит древовидную структуру в XML, которая загружается при запуске. Как только я пытаюсь загрузить XML с помощью сериализации, Boom. Это происходит только на одном компьютере конечного пользователя. У него есть права администратора, много места на диске, память и т. Д.

Прежде чем я проигнорировал это как проблему с компьютером или антивирусную / шпионскую программу и включил его ИТ-отдел (кропотливый процесс), я хотел посмотреть, есть ли лучший способ отследить это и получить больше информации. Поскольку XmlSerialization является черным ящиком, я не уверен, что как разработчик я могу сделать гораздо больше. Или я могу?

Любые советы приветствуются, полная ошибка ниже.

Невозможно создать временный класс (Результат = 1). ошибка CS2000: компилятор инициализация не удалась неожиданно - «Недостаточно памяти для завершите эту операцию. «

Stack Trace: 

   at System.Xml.Serialization.Compiler.Compile(Assembly parent, String ns, XmlSerializerCompilerParameters xmlParameters, Evidence evidence)
   at System.Xml.Serialization.TempAssembly.GenerateAssembly(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, Evidence evidence, XmlSerializerCompilerParameters parameters, Assembly assembly, Hashtable assemblies)
   at System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, String location, Evidence evidence)
   at System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping, Type type, String defaultNamespace)
   at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace)
   at System.Xml.Serialization.XmlSerializer..ctor(Type type)
   at Internal.Objects.TreeSetItemManager.LoadTreeItems(String fileName) in TreeSetItemManager.cs:line 41
   at SPA.Windows.MasterWindow.OnInitialized(EventArgs e)
5/28/2009 10:16:20 Message:
External component has thrown an exception.Details:
   at MS.Win32.UnsafeNativeMethods.ITfThreadMgr.Activate(Int32& clientId)
   at System.Windows.Input.TextServicesContext.RegisterTextStore(DefaultTextStore defaultTextStore)
   at System.Windows.Input.DefaultTextStore.get_Current()
   at System.Windows.Input.TextServicesContext.SetFocusOnDefaultTextStore()
   at System.Windows.Input.InputMethod.EnableOrDisableInputMethod(Boolean bEnabled)
   at System.Windows.Input.TextServicesManager.Focus(DependencyObject focus)
   at System.Windows.Input.KeyboardDevice.ChangeFocus(DependencyObject focus, Int32 timestamp)
   at System.Windows.Input.KeyboardDevice.TryChangeFocus(DependencyObject newFocus, IKeyboardInputProvider keyboardInputProvider, Boolean askOld, Boolean askNew, Boolean forceToNullIfFailed)
   at System.Windows.Input.KeyboardDevice.Focus(DependencyObject focus, Boolean askOld, Boolean askNew)
   at System.Windows.Input.KeyboardDevice.Focus(IInputElement element)
   at System.Windows.Interop.HwndKeyboardInputProvider.FilterMessage(IntPtr hwnd, Int32 message, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)

Ответы [ 7 ]

1 голос
/ 09 июня 2009

В этой статье MSDN говорится, что вы должны восстановить или переустановить .NET Framework SDK. Можете ли вы попробовать это и посмотреть, поможет ли это?

1 голос
/ 30 июня 2009

Обновление.

Проблема закончилась конфликтом с программным обеспечением Cisco Security Agent и запутыванием, выполняемым Xenocode. Если одно или другое исключено из уравнения, исключение не происходит. Я также попробовал несколько способов обойти это, но безрезультатно. Итак, я получил запрос в Xenocode (общение с Cisco было бесполезной тратой времени). Может быть, они смогут докопаться до сути происходящего.

1 голос
/ 06 июня 2009

Вы можете попытаться предварительно сгенерировать сборки сериализации XML (с помощью sgen.exe или с помощью параметра на панели «Сборка» свойств проекта) и выпустить их вместе с вашим приложением. Таким образом, их не нужно будет генерировать во время выполнения, и вы не получите это исключение

1 голос
/ 02 июня 2009

Несмотря на то, что у него есть права администратора, куда указывает% TEMP% на этой машине? А вы можете вручную создавать / удалять файлы там?

Во-вторых, сколько памяти у неисправного компьютера, а не у последующих?

0 голосов
/ 07 июня 2009

Небольшое исследование показывает, что под «хранилищем» система ссылается на память для процесса, а не на дисковое пространство.

Учитывая, что XmlSerializer будет создавать сборку в памяти из кода C #, похоже, что это может быть местом для начала. Некоторые вещи для расследования могут включать в себя:

  • Большой ли граф объектов XML? (Я признаю, что, скорее всего, это будет проблемой, если в сериализации лежит проблема, а не в десериализации ...)
  • Есть ли что-нибудь необычное в конфигурации памяти этой рабочей станции? Много ли запущено других процессов, не осталось виртуальной памяти или какое-то другое необычное давление?

В любом случае, +1 за предложение предварительно скомпилировать XML, если это предварительно заданные данные в стиле конфигурации, которые должны быть подходящими.

0 голосов
/ 06 июня 2009

Учитывая, что в сообщении об ошибке указано «Недостаточно памяти для выполнения этой операции.», Я предполагаю, что проблема не в том, что в расположении, где находится файл XML, недостаточно места или нет разрешений. Я предполагаю, что временная папка, в которую удаляются промежуточные файлы временной сборки, является причиной проблемы.

XmlSerialization в .NET использует генерацию кода для создания исходного кода C #, который затем компилируется (который в конечном итоге использует CSharpCodeProvider, который является частью CodeDom.) CodeDom компилирует исходный код очень похоже на компилятор командной строки csc.exe, так что временное промежуточное звено объектные файлы часто необходимо создавать на диске, прежде чем можно будет сгенерировать окончательную сборку (независимо от того, является ли она сборкой в ​​памяти или нет.)

Я бы выяснил, где находятся эти временные файлы, и убедился бы, что на диске достаточно места. Убедитесь, что у пользователя, у которого возникла проблема, нет какой-либо квоты пространства, где также создаются эти временные файлы, как если бы он использовал свою квоту, что также может привести к исключениям пространства хранения. Временное расположение этих файлов настраивается с помощью XmlSerializerSection в файле .config ваших приложений, поэтому, если действительно существует проблема с пространством, вы можете попытаться временно перенаправить их на диск, на котором достаточно места (и разрешения на чтение / запись / удаление для текущий пользователь.)

0 голосов
/ 02 июня 2009

Совет: у нас была похожая проблема с тегами msxsl: script в XSLT с использованием скомпилированного преобразования .NET. Обратите внимание, что ошибка, о которой вы сообщили, возникает в методе компиляции сериализатора.

Вы проверили место на диске и разрешения, но, возможно, пользователь процесса не является администратором, например, процесс asp.net.

ПРЕДУПРЕЖДЕНИЕ. Класс Microsoft .NET XslCompiledTransform вызывает несколько проблем при использовании сценария msxsl :. XslCompiledTransform создает DLL во временной папке и блокирует ее в памяти.

  1. Процесс ASP.NET может не иметь доступа к временной папке, и XSLT завершится ошибкой.
  2. Временная DLL не является временной и остается в папке: одна DLL на каждое преобразование, использующее сценарий msxsl :. В конце концов жесткий диск сервера заполнен до отказа.
  3. DLL заблокирована в памяти, что вызывает серьезную утечку памяти.

НЕ ИСПОЛЬЗУЙТЕ msxsl: script С классом Microsoft .NET XslCompiledTransform. Вместо этого используйте объект расширения для вызова методов C # или VB.NET вне XSLT. См. Документацию Microsoft по объектам расширения XSLT .

(http://dev.ektron.com/kb_article.aspx?id=482)

...