System.InvalidOperationException: невозможно создать временный класс (результат = 1) - PullRequest
61 голосов
/ 18 марта 2009

Я разработал приложение с использованием .net 3.5 и развернул его как .exe на нескольких машинах в одной среде. Однако на одной конкретной машине я получаю следующую ошибку. Трассировка стека:


См. Конец этого сообщения для деталей о вызове Отладка по времени (JIT) вместо этого диалогового окна.

System.InvalidOperationException: Unable to generate a temporary class (result=1).
error CS2001: Source file 'C:\WINDOWS\TEMP\wz58eig4.0.cs' could not be found
error CS2008: No inputs specified

   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.GetSerializersFromCache(XmlMapping[] mappings, Type type)
   at System.Xml.Serialization.XmlSerializer.FromMappings(XmlMapping[] mappings, Type type)
   at System.Web.Services.Protocols.SoapClientType..ctor(Type type)
   at System.Web.Services.Protocols.SoapHttpClientProtocol..ctor()
   at SSOClient..ctor()
   at sc.tradesvc.SSOManager..ctor()
   at sc.tradesvc.SSOManager.get_Inst()
   at sc.cashflowgenerator.Controls.LoginForm.btnLogin_Click(Object sender, EventArgs e)
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.PerformClick()
   at System.Windows.Forms.Form.ProcessDialogKey(Keys keyData)
   at System.Windows.Forms.TextBoxBase.ProcessDialogKey(Keys keyData)
   at System.Windows.Forms.Control.PreProcessMessage(Message& msg)
   at System.Windows.Forms.Control.PreProcessControlMessageInternal(Control target, Message& msg)
   at System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG& msg)

Загруженные сборки:

mscorlib
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase: file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll

CashflowGenerator
    Assembly Version: 1.0.0.0
    Win32 Version: 1.0.0.0
    CodeBase: file:///C:/DATA/DEVEL/Output/CashflowGenerator.exe

System.Windows.Forms
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll

System
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll

System.Drawing
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll

System.Configuration
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Configuration/2.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll

System.Xml
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll

System.Core
    Assembly Version: 3.5.0.0
    Win32 Version: 3.5.21022.8 built by: RTM
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Core/3.5.0.0__b77a5c561934e089/System.Core.dll

System.Web.Services
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Web.Services/2.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll

************** JIT Отладка ************** Чтобы включить отладку по времени (JIT), файл .config для этого приложение или компьютер (machine.config) должны иметь Значение jitDebugging установлено в разделе system.windows.forms. Приложение также должно быть скомпилировано с отладкой включен.

Например:

Когда JIT-отладка включена, любое необработанное исключение будет отправлен в отладчик JIT, зарегистрированный на компьютере а не обрабатываться этим диалоговым окном.


Может ли кто-нибудь помочь мне с этим?

Поскольку я новичок в .net, кто-то может также сказать мне, когда сначала нужно создавать временный класс?

Ответы [ 11 ]

90 голосов
/ 06 марта 2014

Я просто потратил много времени в поисках ответа на этот вопрос, поэтому я решил добавить его сюда, чтобы избавить некоторых от головной боли. Если вы используете инструмент xsd.exe для генерации вашего cs, он может добавить двойные массивы [] [], где массив должен быть []. Замените все [] [] на [] в созданном вами файле cs и повторите попытку.

30 голосов
/ 18 марта 2009

Сериализация XML работает путем генерации кода для выполнения сериализации. Это делается во временной сборке, созданной для этой цели в первый раз, когда это необходимо.

Однако это зависит от возможности записи сборки на диск. 1

Ваши варианты: (1), учитывая учетную запись пользователя, на котором запущено разрешение на запись процесса (для приложения ASP.NET это, вероятно, будет плохой идеей). (2) Используйте инструмент SDK ( sgen.exe ) для предварительного создания (во время разработки / компиляции) сборки сериализации, а затем используйте (и разверните) эту сборку.

1 Открытый вопрос: API существуют для динамического создания сборок в памяти: почему бы не сделать это?

24 голосов
/ 07 апреля 2009

Вам нужно только предоставить список содержимого папки и разрешения на чтение для% windir% \ Temp.

Я нашел это сообщение, когда пытался исправить мою проблему, и мне не нужно было давать моей учетной записи доступ к записи.

От Microsoft

5 голосов
/ 17 августа 2011

Вам нужно дать разрешение на временную папку, которая находится в папке Windows. И ваша проблема решена ...........

3 голосов
/ 18 марта 2014

Комментарий Surfacing @ grzenio для недавних пользователей:

Если перейти к «Свойства проекта» -> «Сборка» -> «Создать сборку сериализации» -> «Вкл.», Она принудительно генерирует сборку XML-сериализаторов во время компиляции, устраняя необходимость делать это во время выполнения.

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

2 голосов
/ 18 февраля 2013

Вам необходимо добавить * IIS_IUSR * пользователя с разрешением на запись в C: \ Windows \ Temp folder

ПРИМЕЧАНИЕ : все пользователи не будут работать с полным контролем.

1 голос
/ 28 августа 2014

Это может быть также простой ошибкой в ​​сериализованном классе (как правило, результатом некоторого копирования / вставки). Например, следующий класс вызовет эту ошибку:

  public class Foo
  {
      private string[] contexts;

      /// <remarks/>
      [System.Xml.Serialization.XmlArrayItemAttribute("Context", 
       typeof(Property), IsNullable = false)]
      public string[] Contexts
      {
          get { return this.contexts; }
          set { this.contexts = value; }
      }
  }

Обратите внимание, что параметр typeof (Свойство) в атрибуте XmlArrayItem не совместим (наиболее вероятно) со строкой, вызывающей похожее исключение:

System.InvalidOperationException: 
Unable to generate a temporary class (result=1).

Если typeof (Свойство) заменено на typeof (строка) , сериализация снова будет работать.

0 голосов
/ 10 апреля 2014

В случае, если это кому-нибудь поможет, моя проблема возникла из унаследованного класса, использованного в сериализации. Проблема ушла, когда я сделал полную копию / вставку своего класса, я сериализовал и прекратил использование инерции. К сожалению, преимущества наследования ушли, но это лучше, чем иметь эту проблему. (Эй, по крайней мере, я почти уверен, что это и решило проблему. Произошла перезагрузка там тоже.)

0 голосов
/ 10 ноября 2013

Возможно, вы переключаете идентификацию пула приложений в IIS быть паролем вместо предопределенного так что у вас есть один из следующих

  1. возврат к предопределенному
  2. предоставить пользователю полный доступ к выводу пользователя IWAM_WBSRV-01 в папке временных файлов Windows
0 голосов
/ 11 марта 2013

Предоставить права на чтение / запись для папки 'C: \ WINDOWS \ TEMP'. Это будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...