1

私の C# アプリケーションには 2 つのバージョンのインストーラーがあります。V1 と V2 と言います。

V1をインストールしました。また、セットアップ プロジェクトのレジストリ設定でInstallDir= [TARGETDIR]、アプリケーションのインストール フォルダを指定するレジストリ キーを作成しました。したがって、インストール フォルダーを取得する場合は、生成したレジストリ キーを使用してパスを取得できます。

問題は、バージョン 2 V2 のインストール中です。以前のバージョンのインストール フォルダーにある example.txt というファイルをどこかにコピーする必要があります。

次のように、Install 状態のインストーラー クラスにカスタム アクションを作成しました。

   public override void Install(IDictionary stateSaver)
    {
        base.Install(stateSaver);
        string path = null;
        string registry_key = @"SOFTWARE\";
        using (Microsoft.Win32.RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key))
        {
            foreach (string subkey_name in key.GetSubKeyNames())
            {
                if (subkey_name == "default Company Name")
                {
                    using (RegistryKey subkey = key.OpenSubKey(subkey_name))
                    {
                        path = (string)subkey.GetValue("InstallDir");

                    }
                }
            }
        }
        string fileName = "example.txt";
        string sourcePath = path;
        string targetPath = @"C:\Users\UserName\Desktop";

        // Use Path class to manipulate file and directory paths. 
        string sourceFile = System.IO.Path.Combine(sourcePath, fileName);
        string destFile = System.IO.Path.Combine(targetPath, fileName);

        // To copy a folder's contents to a new location: 
        // Create a new target folder, if necessary. 
        if (!System.IO.Directory.Exists(targetPath))
        {
            System.IO.Directory.CreateDirectory(targetPath);
        }

        // To copy a file to another location and  
        // overwrite the destination file if it already exists.
        System.IO.File.Copy(sourceFile, destFile, true);


    }

私が考えたのは、カスタム アクションの Install メソッドでレジストリからのパスを指定すると、以前のバージョンのパスが取得され、以前のバージョンのインストール パスにファイルがコピーされるということです。

ただし、カスタム アクションの Install メソッドをコピーしても、レジストリは新しいバージョンのパスで更新され、現在の値を取得して新しいバージョンのファイルで更新されます。

しかし、そのインストール フォルダに以前のバージョンのファイルが必要です。

どうすればそれを達成できますか?

4

2 に答える 2

1

このアプローチに従うことをお勧めします。

したがって、問題は、Sqllite ファイルがインストール フォルダーにある必要があり、新しい MSI バージョンをインストールすると、既存のアプリケーションがアンインストールされ、trun で Sqllite を含むすべてのファイルが削除されることです。

を作成することで解決できますconsole application。sqllit ファイルをコンソール アプリケーションに追加します。コンソール exe が実行されると、現在実行中のフォルダに sqllite ファイルがコピーされます。

AppDomain.CurrentDomain.BaseDirectory;

このコンソール exe を MSI プロジェクトに追加し、インストーラー クラス内で を使用してこの exe を実行しProcess.Start()ます。この sqllite ファイルは別の exe アプリケーションによってコピーされ、MSI のアンインストール時にこの sqllite ファイルは MSI プロジェクトの一部ではないため、sqllite ファイルは削除されずにフォルダーに残ります。

これで問題が解決することを願っています。

于 2013-10-01T13:32:36.810 に答える