1

我尝试使用 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后建事件命令行(对于 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 设计,我不应该将 LibrarySettings 类代码从 MyLibrary.dll 带到 BugTest.exe 代码。

4

1 回答 1

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对我的解决方案非常有用。

于 2012-12-05T09:56:04.130 回答