如果不在合并的可执行文件上使用csc.exe,则ApplicationSettingsBase和XmlSerialization无法正常工作

时间:2012-12-04 17:06:56

标签: c# .net xml-serialization

我尝试使用ApplicationSettingsBase类的Save方法保存一些应用程序数据。我有一个net 2.0 exe(BugTest.exe)和一个net 2.0 dll(MyLibrary.dll)。 exe正在使用dll(引用它)。我的主要exe代码是这样的:

public class ApplicationSettings : ApplicationSettingsBase
{
    [UserScopedSetting]
    [DefaultSettingValue(null)]
    public Settings Settings
    {
        get
        {
            return ((Settings)this["Settings"]);
        }
        set
        {
            this["Settings"] = value;
        }
    }

    [UserScopedSetting]
    [DefaultSettingValue(null)]
    public LibrarySettings LibrarySettings
    {
        get
        {
            return ((LibrarySettings)this["LibrarySettings"]);
        }
        set
        {
            this["LibrarySettings"] = value;
        }
    }  
}

public class Settings
{
    public string FirstValue { get; set; }
    public string LastValue { get; set; }
}

private void btnSave_Click(object sender, EventArgs e)
{
    Settings settings = new Settings {FirstValue = "1", LastValue = "2"};
    LibrarySettings librarySettings = new LibrarySettings { LibrarySettings1Value = "1", LibrarySettings2Value = "2" };

    ApplicationSettings applicationSettings  = new ApplicationSettings {Settings =  settings, LibrarySettings =  librarySettings};
    applicationSettings.Save();
}

MyLibrary.dll代码是:

public class LibrarySettings
{
    public string LibrarySettings1Value { get; set; }
    public string LibrarySettings2Value { get; set; }
}

对我来说,为我的项目使用预先构建的xmlSerialization dll非常重要。所以,然后我添加“$(FrameworkSDKDir)\ Bin \ sgen”/ a:“$(TargetPath)”/ force post-built事件命令行(exe和dll都有)。然后我在我的发布目录中获得了两个xmlSerialization dll:(BugTest.XmlSerializers.dll和MyLibrary.XmlSerializers.dll)

我启动应用程序并启动进程监视器。一切都很好,我的应用程序设置成功保存。我看到csc.exe(运行时编译器)从未在序列化期间运行。对我来说,在没有csc.exe的情况下进行Xmlserialization也很重要。所以一切都很适合我。

同样在我的项目中,我要合并BugTest.exe和Mylibrary.dll。 所以我使用ILMerge并合并了BugTest.exe和MyLibrary.dll 。输出是BugTest.exe。 (BugTest.XmlSerializers.dll和MyLibrary.XmlSerializers.dll未合并。)当我运行并单击此合并的BugTest.exe的保存按钮时,可以再次将应用程序数据保存到文件但进程监视器屏幕提醒我此xmlserialization由CSC.EXE。 BugTest.XmlSerializers.dll和MyLibrary.XmlSerializers.dll与BugTest.exe位于同一目录中但为什么我的应用程序这次使用csc.exe进行XmlSerialization而不是XmlSerializers.dlls? 如何强制合并的可执行文件使用XmlSerializers.dlls?

  

注意:由于OOP设计,我不应该将MyLibrary.dll中的LibrarySettings类代码带到BugTest.exe代码中。

1 个答案:

答案 0 :(得分:0)

我刚刚通过改变某些流程的顺序解决了这个问题。

如果我编译项目而不生成XMLSerialization dll,然后将BugTest.exe和MyLibrary.dll合并为一个新的BugTest.exe,然后从这个新的BugTest.exe(使用sgen)生成BugTest.XmlSerialization.dll,那么我的应用程序正常工作完美。

这篇文章http://blog.bits-in-motion.com/2009/11/xmlserializers-moduleversionid-ilmerge.html对我的解决方案非常有用。