XmlSerializers with addin outlook
本文关键字:outlook addin with XmlSerializers | 更新日期: 2023-09-27 18:01:27
我正在尝试创建outlook插件,但是反序列化和防病毒程序出现问题。
我注意到,当我的加载程序试图反序列化任何数据时,. net框架在“C:'Users'{UserName}'AppData'Local'Temp'"
文件夹中创建临时dll。
此dll存在的时间很短,但不时防病毒锁定它,加载项抛出错误消息file is used by another process
.
我试图摆脱临时dll,并发现建议使用sgen工具创建xmlserializer .dll。
我生成MyAssembly。XmlSerializers.dll具有强名称,并将其放置到带有插件的文件夹(C:'Program Files (x86)'MyAddin)。但这没有用。
然后我尝试放置MyAssembly。xmlserializer .dll到GAC,然后到outlook文件夹,但没有成功。当从GAC调用dll时,我得到了以下错误消息,但dll没有任何引用。
"先。无法加载文件或程序集它的一个依赖项。系统找不到指定的文件。"
请添加任何想法,我如何才能摆脱临时dll
当首次构造类型的XmlSerializer
时,XML序列化引擎内部生成c#代码来序列化和反序列化该类型,将其写入临时文件的%TEMP%
中,然后编译和加载生成的程序集,最后删除任何临时文件。(XmlSerializer
的后续用法重用创建的程序集,详细信息请参见此处。)
看起来你的杀毒软件在扫描Outlook进程创建的任何"意外"文件时都非常积极,立即捕获文件的创建并扫描结果。虽然在大多数情况下,这似乎是值得称赞的,但它显然与微软的XmlSerializer
设计相冲突。
那么,该怎么办呢?您有几个选项:
-
切换到不使用此架构的
DataContractSerializer
。但是,DataContractSerializer
不如XmlSerializer
灵活,如果不进行预处理,可能无法解析XML。 -
启用预编译的序列化程序集。像文档中指定的那样简单地设置
GenerateSerializationAssemblies = On
是不够的,您必须跳过几个环节才能使其实际工作。有关生成Xml序列化程序集的方法,请参阅生成Xml序列化程序集作为构建的一部分的答案。我能够通过按描述编辑我的项目文件,然后删除Platform="$(Platform)"
属性,使接受的答案与我的旧Visual Studio 2008一起工作。你可能需要根据你的VS版本调整答案。在实际启用预生成的序列化dll之后,我用Process Monitor验证了在测试控制台应用程序中反序列化XML时没有将文件写入
%TEMP%
。请参阅此处:使用预生成的xmlserializer提高性能。
经过一些测试,我发现,如果您的根对象不存在于您正在构建的程序集中,或者它是像
List<T>
或T []
这样的泛型集合,则不使用预编译的序列化程序集。但是,创建List<T>
的非泛型子类会重新启用序列化程序集,例如public class RootObjectList : List<RootObject> { }
。有关更多信息,请参阅此处:所有关于XmlSerializer性能和Sgen.
-
使用JSON将XML转换为JSON。
-
如果您的XML很简单,您可以将其加载到
XDocument
中并使用Linq to XML
查询。