当我尝试序列化类型时,我一直在使用的应用程序失败.
像这样的陈述
XmlSerializer lizer = new XmlSerializer(typeof(MyType));
Run Code Online (Sandbox Code Playgroud)
生产:
System.IO.FileNotFoundException occurred
Message="Could not load file or assembly '[Containing Assembly of MyType].XmlSerializers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified."
Source="mscorlib"
FileName="[Containing Assembly of MyType].XmlSerializers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
FusionLog=""
StackTrace:
at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
at System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
Run Code Online (Sandbox Code Playgroud)
我没有为我的班级定义任何特殊的序列化器.
我该如何解决这个问题?
我使用.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 …Run Code Online (Sandbox Code Playgroud) 我刚刚将包含WinForms,通用库和Web应用程序的VS 2008解决方案升级到VS 2010,但所有项目仍然针对.NET 3.5 SP 1.我使用此技术为我的常用库生成XmlSerializers.WinForms应用程序运行正常.当我的Web应用程序尝试使用引用相同XmlSerializers的这些库运行时,它会抛出以下内容:
'/ WebSubscribers'应用程序中的服务器错误.无法加载文件或程序集"Ceoimage.Basecamp.XmlSerializers"或其依赖项之一.此程序集由比当前加载的运行时更新的运行时构建,无法加载.描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.
异常详细信息:System.BadImageFormatException:无法加载文件或程序集"Ceoimage.Basecamp.XmlSerializers"或其依赖项之一.此程序集由比当前加载的运行时更新的运行时构建,无法加载.
我已经使用.NET Reflector查看了XmlSerializer的引用,并看到它引用了2.0和4.0版本mscorlib以及3.5和4.0版本System.Data.Linq.奇怪的是,它只使用4.0版本System.Xml.那可能是我的问题.
如何使用这些XmlSerializers运行Web应用程序?当我简单地删除那些XmlSerializers时,Web应用程序运行正常.这是一个选项,但是如何强制MSBUILD为特定版本的CLR创建序列化程序?
这是我添加到项目文件的MSBuild任务,它强制创建XmlSerializers:
<Target Name="AfterBuild" DependsOnTargets="AssignTargetPaths;Compile;ResolveKeySource" Inputs="$(MSBuildAllProjects);@(IntermediateAssembly)" Outputs="$(OutputPath)$(_SGenDllName)">
<Delete Files="$(TargetDir)$(TargetName).XmlSerializers.dll" ContinueOnError="true" />
<SGen BuildAssemblyName="$(TargetFileName)" BuildAssemblyPath="$(OutputPath)" References="@(ReferencePath)" ShouldGenerateSerializer="true" UseProxyTypes="false" KeyContainer="$(KeyContainerName)" KeyFile="$(KeyOriginatorFile)" DelaySign="$(DelaySign)" ToolPath="$(SGenToolPath)">
<Output TaskParameter="SerializationAssembly" ItemName="SerializationAssembly" />
</SGen>
</Target>
Run Code Online (Sandbox Code Playgroud) msbuild sgen visual-studio-2010 .net-reflector xmlserializer
我有一个大型的第三方网络服务; reference.cs是33 MB.使用Visual Studio 2017,代理使用XML Serializer,在创建通道时会导致5秒的延迟.我在微软开了一个案例,他们向我展示了如何修改reference.cs以使用Datacontract序列化器.在同一台机器上,通道创建时间为20毫秒,完全符合我的需求.
不幸的是,消息失败并带来微小的差异,微软的支持也无济于事.
有已知的限制吗?我应该寻找的任何模式确保它根本不起作用我应该开始使用HTTP请求重写所有内容?
导致整体延迟的实际方法:
public XmlMembersMapping ImportMembersMapping(string elementName, string ns,
XmlReflectionMember[] members, bool hasWrapperElement, bool writeAccessors,
bool validate, XmlMappingAccess access) {
ElementAccessor element = new ElementAccessor();
element.IsSoap = true;
element.Name = elementName == null || elementName.Length == 0 ? elementName :
XmlConvert.EncodeLocalName(elementName);
}
Run Code Online (Sandbox Code Playgroud) 我用a XmlSerializer来序列化/反序列化一些对象.问题在于性能.在进行性能分析时,使用XmlSerializermake我们的应用程序启动时间要长2秒.我们缓存我们的XmlSerializer并重用它们.我们不能使用sgen.exe,因为我们正在创建XmlSerializer XmlAttributeOverrides.
我尝试使用像Json.Net这样的序列化替代方案,起初它的工作很棒.问题是我们需要向后兼容,因此需要正确解析已生成的所有xml.此外,对象序列化输出必须是Xml.
总结一下:
我正在使用 WCF 测试客户端向服务发出请求,但是出现以下错误:
Could not load file or assembly 'aDoc_Client.XmlSerializers' or one of its dependencies. The system cannot find the file specified.
Server stack trace:
at System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter)
at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, …Run Code Online (Sandbox Code Playgroud) 在Windows 10上运行VS 2017 15.5.3.
获取此通用错误"指定的任务可执行文件"sgen.exe"无法运行.文件名或扩展名太长"在Release配置和X64平台中构建项目时.但它在Debug配置和Any CPU平台上构建良好.
能够构建它但是在将"生成序列化组件"设置为OFF之后.
不要认为文件名很长.有人会对此有所了解吗?
最好的祝福,
Damodar
我有一个ASP.NET 2.0 Web应用程序在一个众所周知的Web托管提供商的共享服务器上运行.偶尔我似乎得到这样的错误:
找不到文件'C:\ WINDOWS\TEMP\lxnmfrsz.dll'.描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.
异常详细信息:System.IO.FileNotFoundException:找不到文件'C:\ WINDOWS\TEMP\lxnmfrsz.dll'.
我四处寻找,似乎这是一个常见的问题.一种解决方案是清除临时文件夹或重新启动IIS.由于我不能在我不拥有的服务器上访问这些东西,所以这些并不是真正的选择.我已经尝试使用web.config中的指令将temp目录设置为其他目录,但它似乎仍然使用默认的临时目录.还有其他方法可以更改临时目录和/或解决此问题吗?
我广泛使用XmlSerializer而不是允许.NET在运行时生成必要的序列化程序集,我想提前生成这些程序集并将它们与我的应用程序捆绑在一起.我能够使用Sgen在构建时生成这些程序集.另外,我必须为我将序列化的每个数组类型单独运行Sgen(使用sgen/t:Foo []).最后,我使用ILMerge将数组类型序列化类合并到Foo.XmlSerializers.dll程序集中.我已经用ildasm验证了Foo.XmlSErializers.dll确实包含了所有合并的类.
在运行时,.NET从Foo.XmlSerializers.dll成功加载FooSerializer,而不调用csc并生成临时程序集.但是,.NET无法从同一个dll加载ArrayOfFooSerializer,实际上会调用csc.
如何成功预生成阵列的序列化类型?
考虑以下2个程序集及其简化内容:
汇编:MyApp.exe
public class MyApp
{
public static int Main(string[] args)
{
new XmlSerializer(typeof(Foo));
new XmlSerializer(typeof(Foo[]));
}
}
Run Code Online (Sandbox Code Playgroud)
汇编:Foo.dll
public class Foo
{
}
Run Code Online (Sandbox Code Playgroud)
更多信息:
以下app.config导致将与XmlSerialization相关的事件添加到事件日志中
<configuration>
<system.diagnostics>
<switches>
<add name="XmlSerialization.PregenEventLog" value="1" />
<add name="XmlSerialization.Compilation" value="1" />
</switches>
</system.diagnostics>
</configuration>
Run Code Online (Sandbox Code Playgroud)
我看不到Foo类型的事件.我看到Foo []的以下消息:
预生成的序列化程序'Foo.XmlSerializers'已过期.您需要为'Foo []'重新生成序列化程序.
我已经实现了在生成一个Xml序列化程序集的接受答案中提到的更改作为我的构建的一部分
<Target Name="AfterBuild" DependsOnTargets="AssignTargetPaths;Compile;ResolveKeySource" Inputs="$(MSBuildAllProjects);@(IntermediateAssembly)" Outputs="$(OutputPath)$(_SGenDllName)">
<!-- Delete the file because I can't figure out how to force the SGen task. -->
<Delete Files="$(TargetDir)$(TargetName).XmlSerializers.dll" ContinueOnError="true" />
<SGen BuildAssemblyName="$(TargetFileName)" BuildAssemblyPath="$(OutputPath)" References="@(ReferencePath)" ShouldGenerateSerializer="true" UseProxyTypes="false" KeyContainer="$(KeyContainerName)" KeyFile="$(KeyOriginatorFile)" DelaySign="$(DelaySign)" ToolPath="$(SGenToolPath)" Platform="$(Platform)">
<Output TaskParameter="SerializationAssembly" ItemName="SerializationAssembly" />
</SGen>
</Target>
Run Code Online (Sandbox Code Playgroud)
构建exe项目时出现错误信息:
错误14反映类型'myNamespace.myAssembly.myForm.MicroContact'时出错.C:\ dev\src\myClient\myClient\SGEN myClient
这是MicroContact的代码(这里没有什么独特之处):
Public Class MicroContact
Implements IComparable
Private _id As Long
Private _name As String
Public Property Id() As Long
Get
Return _id
End Get
Set(ByVal value As Long)
_id = …Run Code Online (Sandbox Code Playgroud)