0

同じフォルダにあるファイル(インストール時)を別のパスにコピーする必要がexeあります。msi installerこれを行うために、私はinstallerクラスで次のコードを書きました。

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new     
System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "xcopy";
startInfo.UseShellExecute = true;
string directory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string SourcePath = Path.GetFullPath("C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v7.0A\\Bin");
StreamWriter sw = new StreamWriter(@"C:\Users\lovestone\Desktop\data.txt");
sw.WriteLine(directory);
sw.WriteLine(SourcePath);
startInfo.Arguments = "\"" + directory + "\"" + " " + "\"" + SourcePath + "\"" + @" /e /y /I";
process.StartInfo = startInfo;
process.Start();

指定されたパス上に(インストール時に)installer作成されているため、クラスに問題はありません。ファイルをからにdata.txtコピーするにはどうすればよいですか?directorySourcePath

cmd代わりに使用する必要がありxcopyますか?

更新しました

先ほど申し上げましたように、exeinstallerが存在する同じフォルダからファイルをコピーしたいと思います。アプリケーションをインストールするとき。エラーが表示されます:

Unable to find the file from "C:\Program Files (x86)\Default Company Name\inataller". 

ディレクトリからファイルを選択しようとしていますprogram files。しかし、それは私の存在するディレクトリと同じである必要がありexeます。hard-coded他のクライアントに配布されるため、exeのパスは使用しません。同じフォルダからファイルを選択するための適切なコードは何ですか?

コードにいくつか変更を加えました

string directory = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
string SourcePath = Path.GetFullPath("C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v7.0A\\Bin");
File.Copy(Path.Combine(directory, "MyAdHocTestCert.cer"),Path.Combine(SourcePath, "MyAdHocTestCert.cer"));

今それは表示されています:Object reference not set to an instance of an object

4

2 に答える 2

5

myFile.exeを「ディレクトリ」の場所から「SourcePath」にコピーする場合。

string sourceFileName = Path.Combine(directory, "myFile.exe");
string destFileName = Path.Combine(SourcePath, "myFileCopy.exe");

File.Copy(sourceFileName, destFileName);

sourcefilenameは単にコピーしたいファイルの場所であり、destFileNameはそれをコピーしたい場所の宛先です。ファイル名を含みます。

あなたが使用できるexeファイルの場所を取得することに関しては

string directory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
于 2013-02-25T13:37:38.223 に答える
0

これまでに行ったことを無視して、新しいインストーラーを作成し、証明書ファイルを通常どおり作成します。MSI をビルドし、次のコマンドを実行します。

msiexec /a foo.msi TARGETDIR=C:\EXTRACT /qb

C:\EXTRACT を見てみましょう。圧縮されていない MSI とファイルのディレクトリ構造が表示されます。展開するファイルで CER ファイルを上書きします。次に、その MSI をマシンで実行し、どの CER ファイルが展開されたかを確認します。

それは本当に簡単なはずです。InstallShield や WiX などのより優れたツールを使用している場合は、部分的に圧縮された MSI と圧縮されていない単一のファイルを作成できます。MSI 呼び出しの DLL 呼び出しの CMD 呼び出しの XCOPY では、これらすべての恐ろしいカスタム アクション アンチパターンは必要ありません。ところで、VDPROJ が VS2012 から削除されたことをご存知ですか?

于 2013-02-25T17:54:38.577 に答える