【问题标题】:XmlSerializers with addin outlook带有插件前景的 XmlSerializers
【发布时间】:2015-09-25 00:38:50
【问题描述】:

我正在尝试为 Outlook 创建加载项,但遇到反序列化和防病毒程序问题。

我注意到,当我的加载项尝试反序列化任何数据时,.NET 框架在 “C:\Users\{UserName}\AppData\Local\Temp\" 文件夹中创建了临时 dll。
这个dll存在的时间很短,但是杀毒软件时不时会锁定它,并且加载项会抛出错误消息file is used by another process

我试图摆脱临时 dll 并找到使用 sgen 工具创建 XmlSerializers.dll 的建议。

我生成了 MyAssembly。具有强名称的 XmlSerializers.dll 并将其放置到具有加载项的文件夹 (C:\Program Files (x86)\MyAddin)。但这无济于事。

然后我尝试放置 MyAssembly。 XmlSerializers.dll 到 GAC,然后到 Outlook 文件夹,但没有成功。当从 GAC 调用 dll 时,我收到以下错误消息,但 dll 没有任何引用。

“System.IO.FileNotFoundException:无法加载文件或程序集或 它的依赖项之一。系统找不到指定的文件。”

请添加任何想法如何摆脱临时 dll

【问题讨论】:

  • 看起来这个问题根本与 Outlook 无关。我建议创建一个常规的 Windows 窗体应用程序并尝试在那里运行代码。有用吗?
  • 我尝试创建控制台应用程序。复制反序列化逻辑并使用 sgen 工具创建 MyConsole.XmlSerializers.dll。它工作得很好(没有创建临时 dll)。

标签: c# .net xmlserializer


【解决方案1】:

当一个类型的 XmlSerializer 首次被构造时,XML 序列化引擎在内部生成 c# 代码来序列化和反序列化该类型,将其写入临时文件中的 %TEMP%,然后编译并加载生成的程序集,最后删除所有临时文件。 (XmlSerializer 的后续用法会复用创建的程序集,详见here。)

看起来您的防病毒软件在扫描由 Outlook 进程创建的任何“意外”文件时非常激进,立即捕获文件的创建并扫描结果。虽然在大多数情况下这似乎值得称赞,但它显然与 Microsoft 的 XmlSerializer 设计相冲突。

那么,该怎么办呢?您有多种选择:

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

  2. 启用预编译的序列化程序集。像documentation 中指定的那样简单地设置GenerateSerializationAssemblies = On 是不够的,您必须跳过几个圈才能使其真正起作用。请参阅Generating an Xml Serialization assembly as part of my build 的答案以了解如何做到这一点。通过按描述编辑我的项目文件,然后删除Platform="$(Platform)" 属性,我能够使accepted answer 与我的旧Visual Studio 2008 一起使用。您可能需要针对您的 VS 版本调整答案。

    在实际启用预生成的序列化 DLL 后,我使用 Process Monitor 验证在测试控制台应用程序中反序列化 XML 时没有文件写入 %TEMP%

    参见此处:Boost performance with Pre-generated XmlSerializers

    更新

    经过一番测试,我发现,如果您正在构建的程序集中不存在您的根对象,或者如果是像List<T>T [] 这样的泛型集合,则不使用预编译的序列化程序程序集。但是,创建List<T> 的非泛型子类会重新启用序列化程序集,例如public class RootObjectList : List<RootObject> { }.

    更多信息,请看这里:All about XmlSerializer Performance and Sgen

  3. Convert your XML to JSON 使用 Json.NET,然后使用 deserialize the JSON

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多