シナリオ:インストーラーへのインターフェイスを提供するライブラリプロジェクトを作成しました(インストールシールドを使用して作成されたexe)。特定のファイルがインストーラーフォルダーに存在するかどうかを確認したいと思います。
私は以下を試しました:
1). Assembly.GetEntryAssembly().Location
//「オブジェクト参照がオブジェクトのインスタンスに設定されていません」をスローします
2). new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath
//戻り:C:\ Windows\Microsoft.Net\Assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
3). Assembly.GetExecutingAssembly().Location
//空の文字列を返します
4). AppDomain.CurrentDomain.BaseDirectory
//実際のパスに関係なく「C:\ Windows\syswow64 \」を返します
インストーラが実行されている場所からディレクトリパスを取得するにはどうすればよいですか?
私自身の質問に答えます。ライブラリプロジェクトから現在のパスを取得することはできません。インストーラーから入手する必要があります。他に方法はありません。
ありがとうございました。
使用できます
Directory.GetCurrentDirectory();
現在のディレクトリパスを取得する
インポートSystem.IO
あなたのexeが置かれているフォルダを取得したい場合
AppDomain.CurrentDomain.BaseDirectory
これは、exeを含むフォルダへの完全なパスを返します。そこから手動でフォルダを追加できます
AppDomain.CurrentDomain.BaseDirectory + @"MyFolder1\MyFolder2";
InstallShieldによってビルドされたMSIベースのインストールを実行していると仮定します。
あなたが抱えている問題は、それらの呼び出しが機能する方法が原因です。あなたはこれを外部DLLに実装していて、DLLには独自の現在のディレクトリはありません-DLLを呼び出すプロセスの現在のディレクトリがあります。この場合、msiexec.exeプロセスから呼び出されているため(カスタムアクションでこれを実行していると想定)、msiexec.exeの現在のディレクトリを取得します。
それとは別に、他のいくつかの観察:
コードを呼び出すタイミングは正確にはわかりませんが、ユーザーがインストールフォルダーを選択する前になる可能性があるため、検索してもあまり役に立ちません。
InstallShieldはおそらくファイル検索のサポートを提供します。これがMSIセットアップの場合は、確実に実行されます。
正当な理由がめったにないため、インストールがインストールフォルダー内のファイルを探すことはほとんどありません。ファイルが必要な場合は、インストールに追加するか、再配布可能ファイルの場合は、標準の再頒布パッケージ(おそらくマージモジュール)を追加します。そのファイルが別のセットアップに属している場合、その製品がアンインストールされたらどうしますか?アプリケーションと互換性があるかどうかバージョンをチェックしていますか?一般に、すべてのセットアップで必要なファイルがインストールされ、複数の異なる製品で使用されている共有ファイルには下位互換性があります。
InstallShieldでそのパスが必要な場合は、これを使用します
Setup.exe-SETUPEXEDIRプロパティを使用します
http://www.installshield.com/news/newsletter/0206-articles/SetupExeDir.asp 。
使用しているinstallshieldのバージョンに応じて、さまざまなプロパティを試してください
1。 SRCDIR
2。 SETUPEXEDIR
3。 SUPPORTDIR
Prepertiesを読み取るC#コードがある場合は、以下のようにMsiGetPropertyを使用します。
MsiGetProperty(hMSI、 "SETUPEXEDIR"、値、サイズ)
これを試してください、それは常に私のために働きます:
Environment.CurrentDirectory
上記のプロパティを次のように使用します。
string currentDirectory = Path.GetDirectoryName(Environment.CurrentDirectory);