System.InvalidOperationException:无法生成临时类(结果= 1)

我已经使用.net 3.5开发了一个应用程序,并且已经将它作为一个.exe文件在具有相同环境的多台机器上进行了部署。 但是,在一台特定的机器上,我得到以下错误。 堆栈跟踪:


有关调用实时(JIT)debugging的详细信息,请参阅此消息的结尾,而不是此对话框。

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 

************** JITdebugging**************要启用即时(JIT)debugging,该应用程序的.config文件或计算机(machine.config)必须具有在system.windows.forms部分中设置的jitDebugging值。 应用程序还必须在启用debugging的情况下编译。

例如:

启用JITdebugging时,任何未处理的exception将被发送到计算机上注册的JITdebugging器,而不是由此对话框处理。


有人可以帮我吗?

正如我对.net新手一样,有人也会告诉我,为什么临时类需要首先创build?

XML序列化通过生成代码来执行序列化。 这是在第一次为此目的而创build的临时assembly中完成的。

但是这依赖于能够将程序集写入磁盘。 1

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

1打开问题:API存在在内存中dynamic创build程序集:为什么不这样做?

我花了很多时间寻找这个答案,所以我想在这里添加它来为别人省去一些头痛的问题。 如果您使用xsd.exe工具来生成您的cs,它可能会添加双数组[] [],其中数组应该是[]。 在您生成的cs文件中将[] []全部replace为[],然后重试。

您只需提供%windir%\ Temp上的列表文件夹内容和读取权限。

我试图解决我的问题时发现这个职位,并没有给我的用户帐户写入权限。

来自微软

您需要授予在Windows文件夹中的临时文件夹的权限。 和你的问题解决………..

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

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

Surfacing @ grzenio对最近的用户进一步的评论:

如果您转到Project Properties – > Build – > Generate serialization assembly – > On,它会在编译时强制生成XML序列化程序集,从而不需要在运行时这样做。

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

存在的API可以在内存中dynamic创build程序集:为什么不这样做呢?

只是疯狂的猜测:我认为这种可能性在.NET 1.0中还不存在,或者至less在创buildXmlSerializer时,MS不喜欢改变现有的行为。

授予读/写权限到“C:\ WINDOWS \ TEMP”文件夹。 它会工作。

这可能是因为您在IIS中将应用程序池身份切换为密码而不是预定义,所以您有一个closures以下内容

  1. 返回到预定义
  2. 在Windows临时文件夹中将完全控制权授予用户IWAM_WBSRV-01

如果这有助于任何人,我的问题来自序列化中使用的inheritance类。 当我完成我的课程的完整复制/粘贴,我正在序列化并退出使用无害的时候,问题就消失了。 不幸的是,inheritance的优点已经消失,但是比这个问题要好。 (嘿,至less我很确定这就是解决它的方法,在那里发生了一些重新启动。)

在序列化类中也可能只是一些简单的错误(通常是一些复制/粘贴的结果)。 例如,以下类将导致此错误:

  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)参数与string(最有可能)不兼容,导致类似的exception:

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

如果typeof(Property)被replace为typeof(string),则序列化将再次起作用。