我尝试使用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代码中。
答案 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对我的解决方案非常有用。