1

ApplicationSettingsBaseクラスのSaveメソッドを使用していくつかのアプリケーションデータを保存しようとしています。ネット2.0exe(BugTest.exe)とネット2.0 dll(MyLibrary.dll)があります。エグゼは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; }
}

プロジェクトにビルド済みのxmlSerializationdllを使用することが重要です。そこで、「$(FrameworkSDKDir)\ Bin \ sgen」/a: "$(TargetPath)" / forceビルド後のイベントコマンドライン(exeとdllの両方)を追加します。次に、リリースディレクトリに2つの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と同じディレクトリにありますが、今回、XmlSerializers.dllsの代わりにcsc.exeをXmlSerializationに使用しているアプリケーションはなぜですか?マージされた実行可能ファイルに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 に答える