如果我已经创建了一个序列化程序集,为啥代码会编译一个序列化程序集?

Posted

技术标签:

【中文标题】如果我已经创建了一个序列化程序集,为啥代码会编译一个序列化程序集?【英文标题】:Why does the code compile a serialization assembly if I already created one?如果我已经创建了一个序列化程序集,为什么代码会编译一个序列化程序集? 【发布时间】:2012-06-29 09:43:09 【问题描述】:

我的客户端代码调用了一个老式的 .asmx Web 服务。为了提高性能,我使用以下命令预先生成了序列化程序集,该命令在 bin/release 文件夹中运行:

for %%a in (*.dll) do sgen /assembly:%%a

它本质上是遍历所有 .dll 文件并在它们上调用sgen /assembly:foo.dll。在此命令之后,每个程序集都有一个 foo.XmlSerializers.dll 程序集。

但是,当我分析代码时,我发现代码中仍然存在性能问题,并且它仍然编译序列化程序集(完全忽略我预先生成的程序集,由 ProcMon 验证)。

为什么它不使用我预先生成的序列化程序集?

【问题讨论】:

【参考方案1】:

它尝试加载.XmlSerializers.dll 文件,但由于某种原因失败,而是重新生成它。可能是因为它与您的程序集不同步。

尝试将此添加到您的 app.config 文件中:

<configuration>
    <system.diagnostics> 
        <switches> 
            <add name="XmlSerialization.PregenEventLog" value="1" /> 
        </switches> 
    </system.diagnostics>
</configuration>

这将使生成器将遇到的错误打印到事件日志中。

更多信息:XmlSerializers, ModuleVersionId, ILMerge, and You - Bits in Motion (blog)


您可能也对这个 SO 问题感兴趣:Generating an Xml Serialization assembly as part of my build

【讨论】:

以上是关于如果我已经创建了一个序列化程序集,为啥代码会编译一个序列化程序集?的主要内容,如果未能解决你的问题,请参考以下文章

gcc编译线程程序,为啥要加-lpthread,头文件已经包含了<pthread.h>了啊

C#:为啥要签署程序集?

为啥 int main() 编译?

为啥 .net 配置设置被编译成程序集?

为啥 gtkmm 有时会自动创建第二个线程?

gcc编译线程程序,为啥要加-lpthread,头文件已经包含了<pthread.h>了啊