63

我使用 .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) 必须在 system.windows.forms 部分中设置 jitDebugging 值。还必须在启用调试的情况下编译应用程序。

例如:

启用 JIT 调试后,任何未处理的异常都将发送到计算机上注册的 JIT 调试器,而不是由该对话框处理。


有人可以帮我解决这个问题吗?

由于我是 .net 的新手,有人还可以告诉我为什么需要首先创建一个临时类吗?

4

11 回答 11

107

我只是花了很多时间寻找这个问题的答案,所以我想我会把它添加到这里,以免让其他人头疼。如果您使用 xsd.exe 工具生成您的 cs,它可能添加了双数组 [][],其中数组应该是 []。将生成的 cs 文件中的所有 [][] 替换为 [] 并重试。

于 2014-03-06T12:25:46.440 回答
30

XML 序列化通过生成代码来执行序列化工作。这是在第一次需要时在为此目的创建的临时程序集中完成的。

然而,这依赖于能够将程序集写入磁盘。1

您的选择是(1)给定运行进程写入权限的用户帐户(对于 ASP.NET 应用程序,这可能是一个坏主意)。(2) 使用 SDK 工具 ( sgen.exe ) 预生成(在开发/编译时)序列化程序集,然后使用(和 deplot)该程序集。

1开放式问题:存在 API 以在内存中动态创建程序集:为什么不这样做?

于 2009-03-18T12:16:51.730 回答
24

您只需授予对 %windir%\Temp 的列表文件夹内容和读取权限。

我在尝试解决我的问题时发现了这篇文章,并且不必授予我的用户帐户写入权限。

来自微软

于 2009-04-07T09:00:14.487 回答
5

您需要授予 windows 文件夹中临时文件夹的权限。你的问题就解决了…………

于 2011-08-17T11:10:32.460 回答
4

您需要将具有读写权限的 *IIS_IUSR* 用户添加到C:\Windows\Temp 文件夹

注意:每个用户都不能完全控制。

于 2013-02-18T09:26:30.507 回答
3

为最近的用户进一步展示@grzenio 的评论:

如果您转到项目属性 -> 构建 -> 生成序列化程序集 -> 开,它会强制在编译时生成 XML 序列化程序程序集,而无需在运行时这样做。

反过来,这意味着您不需要更改文件系统权限(例如,如果您在 Windows Azure 网站上托管,这不是一个选项,这很有用)。

于 2014-03-18T10:45:46.993 回答
2

它也可能只是序列化类中的一些简单错误(通常是一些复制/粘贴的结果)。例如下面的类会导致这个错误:

  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; }
      }
  }

请注意, XmlArrayItem 属性中的typeof(Property)参数与导致类似异常的字符串不兼容(很可能):

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

如果typeof(Property)typeof(string)替换,序列化将再次起作用。

于 2014-08-28T15:02:24.300 回答
0

API 的存在是为了在内存中动态创建程序集:为什么不这样做呢?

只是一个疯狂的猜测:我认为这种可能性在 .NET 1.0 中还不存在,或者至少在创建 XmlSerializer 并且 MS 不喜欢改变现有行为时......

于 2009-03-18T12:43:38.047 回答
0

将读/写权限授予“C:\WINDOWS\TEMP”文件夹。它会起作用的。

于 2013-03-11T11:56:06.137 回答
0

这可能是因为您将应用程序池身份切换IIS 为密码而不是预定义的,所以您有以下之一

  1. 返回预定义
  2. 将权限完全控制给 Windows 临时文件夹上的用户 IWAM_WBSRV-01
于 2013-11-10T13:12:00.287 回答
0

如果这对任何人都有帮助,我的问题来自序列化中使用的继承类。当我对我正在序列化的课程进行完整复制/粘贴并使用 ineritance 退出时,问题就消失了。不幸的是,继承的优势消失了,但这比遇到这个问题要好。(嘿,至少我很确定这就是解决它的原因。碰巧在那里进行了重新启动。)

于 2014-04-10T18:58:24.843 回答