System.InvalidOperationException: невозможно создать временный класс (result = 1)

Я разработал приложение с использованием .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, кто-то может также рассказать мне, почему в первую очередь необходимо создать временный класс?

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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

Из Microsoft

Ответ 4

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

Ответ 5

Вам нужно добавить пользователя * IIS_IUSR * с правом чтения для записи в папку C:\Windows\Temp.

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

Ответ 6

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

Если вы перейдете в Project Properties → Build → Generate assemblyization → On, это заставляет генерировать сборку XML-сериализаторов во время компиляции, исключая необходимость сделать это во время выполнения.

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

Ответ 7

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

Просто дикая догадка: я предполагаю, что эта возможность еще не существовала в .NET 1.0 или, по крайней мере, когда был создан XmlSerializer, и MS не любит изменять существующее поведение...

Ответ 8

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

Ответ 9

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

  • вернуться к предопределенным
  • предоставить полный доступ пользователю IWAM_WBSRV-01 в папку временных файлов Windows.

Ответ 10

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

Ответ 11

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

  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 (Property) в атрибуте XmlArrayItem несовместим (скорее всего) со строкой, вызывающей подобное исключение:

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

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