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

XmlSerializers with addin outlook

当首次构造类型的XmlSerializer时,XML序列化引擎内部生成c#代码来序列化和反序列化该类型,将其写入临时文件的%TEMP%中,然后编译和加载生成的程序集,最后删除任何临时文件。(XmlSerializer的后续用法重用创建的程序集,详细信息请参见此处。)

看起来你的杀毒软件在扫描Outlook进程创建的任何"意外"文件时都非常积极,立即捕获文件的创建并扫描结果。虽然在大多数情况下,这似乎是值得称赞的,但它显然与微软的XmlSerializer设计相冲突。

那么,该怎么办呢?您有几个选项:

  1. 切换到不使用此架构的DataContractSerializer。但是,DataContractSerializer不如XmlSerializer灵活,如果不进行预处理,可能无法解析XML。

  2. 启用预编译的序列化程序集。像文档中指定的那样简单地设置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.

  3. 使用JSON将XML转换为JSON。

  4. 如果您的XML很简单,您可以将其加载到XDocument中并使用Linq to XML查询。