C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

インストーラ Microsoft SetupProject /ぽんすけ (18/08/02(Thu) 10:19) #88086
Re[1]: インストーラ Microsoft SetupProject /ぽんすけ (18/08/02(Thu) 10:55) #88087
  └ Re[2]: インストーラ Microsoft SetupProject /とっちゃん (18/08/02(Thu) 11:15) #88088
    └ Re[3]: インストーラ Microsoft SetupProject /ぽんすけ (18/08/02(Thu) 11:18) #88090
      └ Re[4]: インストーラ Microsoft SetupProject /ぽんすけ (18/08/09(Thu) 10:11) #88191
        └ Re[5]: インストーラ Microsoft SetupProject /とっちゃん (18/08/09(Thu) 10:39) #88194
          └ Re[6]: インストーラ Microsoft SetupProject /ぽんすけ (18/08/09(Thu) 10:44) #88196
            └ Re[7]: インストーラ Microsoft SetupProject /ぽんすけ (18/08/20(Mon) 17:25) #88319
              ├ Re[8]: インストーラ Microsoft SetupProject /マダムヤン (18/08/20(Mon) 17:43) #88320
              │└ Re[9]: インストーラ Microsoft SetupProject /ぽんすけ (18/08/20(Mon) 18:00) #88321
              └ Re[8]: インストーラ Microsoft SetupProject /とっちゃん (18/08/20(Mon) 22:41) #88324
                └ Re[9]: インストーラ Microsoft SetupProject /ぽんすけ (18/08/21(Tue) 09:28) #88325
                  └ Re[10]: インストーラ Microsoft SetupProject /ぽんすけ (18/08/22(Wed) 17:00) #88361
                    └ Re[11]: インストーラ Microsoft SetupProject /ぽんすけ (18/08/29(Wed) 13:33) #88422
                      └ Re[12]: インストーラ Microsoft SetupProject /とっちゃん (18/08/29(Wed) 13:51) #88423
                        └ Re[13]: インストーラ Microsoft SetupProject /ぽんすけ (18/08/29(Wed) 14:05) #88424
                          └ Re[14]: インストーラ Microsoft SetupProject /ぽんすけ (18/08/30(Thu) 18:11) #88438 解決済み
                            └ Re[15]: インストーラ Microsoft SetupProject /ぽんすけ (18/09/21(Fri) 23:28) #88722
                              └ Re[16]: インストーラ Microsoft SetupProject /とっちゃん (18/09/22(Sat) 02:40) #88723
                                └ Re[17]: インストーラ Microsoft SetupProject /ぽんすけ (18/09/23(Sun) 11:13) #88747
                                  └ Re[18]: インストーラ Microsoft SetupProject /とっちゃん (18/09/23(Sun) 17:34) #88750
                                    └ Re[19]: インストーラ Microsoft SetupProject /ぽんすけ (18/09/23(Sun) 21:44) #88751
                                      └ Re[20]: インストーラ Microsoft SetupProject /とっちゃん (18/09/25(Tue) 16:51) #88764


親記事 / ▼[ 88087 ]
■88086 / 親階層)  インストーラ Microsoft SetupProject
□投稿者/ ぽんすけ (4回)-(2018/08/02(Thu) 10:19:14)

分類:[インストーラ全般] 

お世話になります。 インストーラについてお伺いします。

Microsoft Visual Studio Community 2017でSetup Projectを追加してインストーラを作成しております。
必須コンポーネントを含めて作成したいと思いましたが、以下のダイアログを表示させたところ、
必要なコンポーネントがないものがありました。

https://docs.microsoft.com/ja-jp/visualstudio/ide/reference/prerequisites-dialog-box?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev15.query%3FappId%3DDev15IDEF1%26l%3DJA-JP%26k%3Dk(Microsoft.VisualStudio.Publish.BaseProvider.Dialog.Bootstrapper)%26rd%3Dtrue

(例)NETFramework4.7.2 など、
これらは手動で追加できないものでしょうか。
[ □ Tree ] 返信 編集キー/

▲[ 88086 ] / ▼[ 88088 ]
■88087 / 1階層)  Re[1]: インストーラ Microsoft SetupProject
□投稿者/ ぽんすけ (6回)-(2018/08/02(Thu) 10:55:01)
No88086 (ぽんすけ さん) に返信
> お世話になります。 インストーラについてお伺いします。
>
> Microsoft Visual Studio Community 2017でSetup Projectを追加してインストーラを作成しております。
> 必須コンポーネントを含めて作成したいと思いましたが、以下のダイアログを表示させたところ、
> 必要なコンポーネントがないものがありました。
>
> https://docs.microsoft.com/ja-jp/visualstudio/ide/reference/prerequisites-dialog-box?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev15.query%3FappId%3DDev15IDEF1%26l%3DJA-JP%26k%3Dk(Microsoft.VisualStudio.Publish.BaseProvider.Dialog.Bootstrapper)%26rd%3Dtrue
>
> (例)NETFramework4.7.2 など、
> これらは手動で追加できないものでしょうか。

すみません、追加になりますが、
フォント ttfファイルもインストーラに追加したいと思うのですが、この場合についても
ご教示いただければありがたいです。
どうぞ、宜しくお願い致します。

[ 親 88086 / □ Tree ] 返信 編集キー/

▲[ 88087 ] / ▼[ 88090 ]
■88088 / 2階層)  Re[2]: インストーラ Microsoft SetupProject
□投稿者/ とっちゃん (506回)-(2018/08/02(Thu) 11:15:24)
No88087 (ぽんすけ さん) に返信
> ■No88086 (ぽんすけ さん) に返信
>>お世話になります。 インストーラについてお伺いします。
>>■No88087 (ぽんすけ さん) に返信
> ■No88086 (ぽんすけ さん) に返信
>>お世話になります。 インストーラについてお伺いします。
>>
>>Microsoft Visual Studio Community 2017でSetup Projectを追加してインストーラを作成しております。
>>必須コンポーネントを含めて作成したいと思いましたが、以下のダイアログを表示させたところ、
>>必要なコンポーネントがないものがありました。
>>
>>https://docs.microsoft.com/ja-jp/visualstudio/ide/reference/prerequisites-dialog-box?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev15.query%3FappId%3DDev15IDEF1%26l%3DJA-JP%26k%3Dk(Microsoft.VisualStudio.Publish.BaseProvider.Dialog.Bootstrapper)%26rd%3Dtrue
>>
>>(例)NETFramework4.7.2 など、
>>これらは手動で追加できないものでしょうか。
>

4.7.2 はまだVSのインストーラには入っていないはずです。

なので、別途SDKおよび、Developer Pack をインストールする必要があります。

https://docs.microsoft.com/ja-jp/dotnet/framework/whats-new/#v472

上記リンクから、必要なものをインストールしてください。

一応。。。上位互換ですが、自分で設定しているアプリの .NET のバージョンが4.7.1 なら .NET のランタイムインストーラも
添付するのは 4.7.1 をお勧めします。

4.6.2 ならもちろん 4.6.2。クライアント環境が4.7.2だから。。。という理由で設定したいのなら、
SDKを入れ、アプリの、.NET Framework のターゲットも4.7.2に更新した上で、同じバージョンのランタイムを搭載してください。



> すみません、追加になりますが、
> フォント ttfファイルもインストーラに追加したいと思うのですが、この場合についても

フォントはシステムに登録を前提に書いておきます。

フォントを追加する場合は、インストール先にフォントのフォルダ(FontFolder)を指定する必要があります。
プロジェクトのコンテキストメニューのView-ファイルシステムを選び、右側に File System を表示します。
ツリーのトップでコンテキストメニューを開くと、Fonts Folder というのがあるのでそれを選択します。
Fonts Folderがツリーに追加されているはずなので、選択してコンテキストメニューを開き、フォントファイルを追加します。
File System の右側のリスト部分にフォントファイルが追加されているので、選択してコンテキストメニューを開きプロパティウィンドウを表示します。

プロパティの、Regser 項目を "vsdrfFont"、SharedLegacyFile の項目を True にします。

これで、任意のフォントファイルをシステムグローバルに登録し、なおかつほかのアプリが同じファイルを追加した場合でも
問題なく共有できるようになります。

[ 親 88086 / □ Tree ] 返信 編集キー/

▲[ 88088 ] / ▼[ 88191 ]
■88090 / 3階層)  Re[3]: インストーラ Microsoft SetupProject
□投稿者/ ぽんすけ (7回)-(2018/08/02(Thu) 11:18:22)
No88088 (とっちゃん さん) に返信

とっちゃん様、ご教示いただきありがとうございます。
これで作ってみます。

取り急ぎ、御礼まで。
[ 親 88086 / □ Tree ] 返信 編集キー/

▲[ 88090 ] / ▼[ 88194 ]
■88191 / 4階層)  Re[4]: インストーラ Microsoft SetupProject
□投稿者/ ぽんすけ (8回)-(2018/08/09(Thu) 10:11:59)
SetupProjectをビルドして、できたインスト―ラを試してみました。
インストール自体は問題なく終了いたしました。

で、実行してみましたところ・・・

Windows10上では問題なくアプリも動作いたしましたが、
Windows7へ入れたところ、以下のようなエラーが発生いたしました。

------------------------------------------------------------
フレームワークのバージョン:v4.0.30319
説明: ハンドルされない例外のため、プロセスが中止されました。
例外情報:System.AccessViolationException
------------------------------------------------------------

ちなみにアプリはC#で作っていますが、C++で作られたDLLを参照しています。
どうもこのDLLを参照時に発生しているようなのですが。。。

Microsoft Visual C++ 再頒布可能パッケージは、x86、x64両方
コンポーネントに入れております。

何が原因として考えられますでしょうか。
ご教示お願い致します。

[ 親 88086 / □ Tree ] 返信 編集キー/

▲[ 88191 ] / ▼[ 88196 ]
■88194 / 5階層)  Re[5]: インストーラ Microsoft SetupProject
□投稿者/ とっちゃん (509回)-(2018/08/09(Thu) 10:39:40)
No88191 (ぽんすけ さん) に返信
> SetupProjectをビルドして、できたインスト―ラを試してみました。
> インストール自体は問題なく終了いたしました。
>
> で、実行してみましたところ・・・
>
> Windows10上では問題なくアプリも動作いたしましたが、
> Windows7へ入れたところ、以下のようなエラーが発生いたしました。
>
インストールするというのは、プログラムを起動するために必要なものをそのマシンに設置する作業を指します。

なので、起動時にファイルが足りないなどであれば、インストール作業のミスとなります。
ですが、起動した後でクラッシュした(アクセス違反なども同様)は、インストールしたプログラムの問題です。
いくらインストーラを眺めてみても解決の糸口は少ないと思われます。


> ちなみにアプリはC#で作っていますが、C++で作られたDLLを参照しています。
> どうもこのDLLを参照時に発生しているようなのですが。。。
>
> Microsoft Visual C++ 再頒布可能パッケージは、x86、x64両方
> コンポーネントに入れております。
>
> 何が原因として考えられますでしょうか。
> ご教示お願い致します。
>
まずはデバッグして「発生しているようなのですが。。。」という状況から
どこでエラーが発生したかをきちんと突き止めましょう。

アクセス違反なので、リモートデバッガを使うのが一番お手軽だと思います。
ほかにも、いろいろとデバッグ手段はあると思いますが、まずは発生個所を突き止めるところから始める必要があります。

[ 親 88086 / □ Tree ] 返信 編集キー/

▲[ 88194 ] / ▼[ 88319 ]
■88196 / 6階層)  Re[6]: インストーラ Microsoft SetupProject
□投稿者/ ぽんすけ (10回)-(2018/08/09(Thu) 10:44:18)
No88194 (とっちゃん さん) に返信

了解いたしました。
ご助言いただきありがとうございます。
デバッガで追いかけてみます。

[ 親 88086 / □ Tree ] 返信 編集キー/

▲[ 88196 ] / ▼[ 88320 ] ▼[ 88324 ]
■88319 / 7階層)  Re[7]: インストーラ Microsoft SetupProject
□投稿者/ ぽんすけ (12回)-(2018/08/20(Mon) 17:25:50)
No88196 (ぽんすけ さん) に返信
> ■No88194 (とっちゃん さん) に返信
>
> 了解いたしました。
> ご助言いただきありがとうございます。
> デバッガで追いかけてみます。
>
上記エラーの件は、別のマシンで実行させてみると発生いたしませんでした。
マシン固有の環境問題であったようです。
どうもすみませんでした。

あと、別件でお伺いいたしたいことがございます。
SetupProjectにlocalDBもコンポーネントに入れているのですが、
setUp時に、データベースの構築もできますでしょうか。

インストールが終了後にSQL server オブジェクトエクスプローラから
データベースの作成、テーブルの作成を行っていますが、
これらをセットアッププロジェクト内に組み込むことができるなら・・・と
現在調査中です。
ご存知であればご教示くださいますようお願い申し上げます。

[ 親 88086 / □ Tree ] 返信 編集キー/

▲[ 88319 ] / ▼[ 88321 ]
■88320 / 8階層)  Re[8]: インストーラ Microsoft SetupProject
□投稿者/ マダムヤン (1回)-(2018/08/20(Mon) 17:43:39)
> マシン固有の環境問題であったようです。

マシン固有の環境問題で片付けてしまって大丈夫ですか?
C#のアプリのターゲットプラットフォームはAny/x86/x64のどれですか?
また、C++のDLLは32ビット版ですか、64ビット版ですか?
あと、エラーの発生したWindows7は32ビット版ですか?64ビット版ですか?
[ 親 88086 / □ Tree ] 返信 編集キー/

▲[ 88320 ] / 返信無し
■88321 / 9階層)  Re[9]: インストーラ Microsoft SetupProject
□投稿者/ ぽんすけ (13回)-(2018/08/20(Mon) 18:00:41)
No88320 (マダムヤン さん) に返信
>>マシン固有の環境問題であったようです。
>
> マシン固有の環境問題で片付けてしまって大丈夫ですか?
> C#のアプリのターゲットプラットフォームはAny/x86/x64のどれですか?
> また、C++のDLLは32ビット版ですか、64ビット版ですか?
> あと、エラーの発生したWindows7は32ビット版ですか?64ビット版ですか?

C#アプリのターゲットプラットフォームはAnyCPUで、
C++のDLLは64ビット版で、Windows7については64ビット版です。
どちらのマシンも64ビットなので、何が違うのか現在まだ調査中です。

[ 親 88086 / □ Tree ] 返信 編集キー/

▲[ 88319 ] / ▼[ 88325 ]
■88324 / 8階層)  Re[8]: インストーラ Microsoft SetupProject
□投稿者/ とっちゃん (510回)-(2018/08/20(Mon) 22:41:54)
No88319 (ぽんすけ さん) に返信
> 上記エラーの件は、別のマシンで実行させてみると発生いたしませんでした。
> マシン固有の環境問題であったようです。
> どうもすみませんでした。
>
マダムヤンさんも書いていますが、環境問題で片付けてしまっても問題ありませんか?
結果的にはその環境では使えないということになりますが、それで問題ないのでしょうか?


> あと、別件でお伺いいたしたいことがございます。
> SetupProjectにlocalDBもコンポーネントに入れているのですが、
> setUp時に、データベースの構築もできますでしょうか。
>
> インストールが終了後にSQL server オブジェクトエクスプローラから
> データベースの作成、テーブルの作成を行っていますが、
> これらをセットアッププロジェクト内に組み込むことができるなら・・・と
> 現在調査中です。
> ご存知であればご教示くださいますようお願い申し上げます。
>
localDBをプログラム的に(C#でよい)登録する方法はわかりますか?
それがわかるのであれば、System.Configuration.Install.Installer クラスを使って
カスタム動作を用意し、そこで登録処理を行います。

Installer クラスのリファレンスに簡単な解説が出ているのでリンクを張っておきます。
https://msdn.microsoft.com/ja-jp/library/system.configuration.install.installer.aspx

VS2005〜2010 までの記事であればバージョンを問わず使用方法等は変わらないので
さらに詳しいことは検索してみてください。


もし、プログラム的に設定する方法がわからないという場合は、学習するかあきらめるか。。。
となります。
また、SQL Server にLocalDBを登録する方法を知りたい場合はこのスレではなく別途質問を上げたほうがいいでしょう。
その際、最終的にインストール時に行いたいというゴールも示しておくとよいと思いますよ。

[ 親 88086 / □ Tree ] 返信 編集キー/

▲[ 88324 ] / ▼[ 88361 ]
■88325 / 9階層)  Re[9]: インストーラ Microsoft SetupProject
□投稿者/ ぽんすけ (15回)-(2018/08/21(Tue) 09:28:38)
No88324 (とっちゃん さん) に返信
ありがとうございます。

> マシン固有の環境問題であったようです。

すみません、詳細は記載できませんが、発生したマシンの
ハード(グラフィック関連)に関する問題であったようです。
この件は解決いたしました。

Installer クラス についてのご教示ありがとうございます。
リファレンスを参照して、試してみたいと思います。

[ 親 88086 / □ Tree ] 返信 編集キー/

▲[ 88325 ] / ▼[ 88422 ]
■88361 / 10階層)  Re[10]: インストーラ Microsoft SetupProject
□投稿者/ ぽんすけ (18回)-(2018/08/22(Wed) 17:00:26)
カスタムインストーラプロジェクトを追加して
LocalDBの登録を行っておりますが、うまくいきません。
申し訳ございません、
「C#プログラムでSQL Server にLocalDBを登録」題して
別スレッドを上げました。
[ 親 88086 / □ Tree ] 返信 編集キー/

▲[ 88361 ] / ▼[ 88423 ]
■88422 / 11階層)  Re[11]: インストーラ Microsoft SetupProject
□投稿者/ ぽんすけ (20回)-(2018/08/29(Wed) 13:33:10)
上記、DB関連については別スレッドで記載させていただいた
ので、ここではDB以外の問題点についてご相談させていただきます。

SetUpProjectを利用してインストーラを作成しております。
カスタム動作を行うためにクラスライブラリを追加し、
このDLL内で以下のように、ユーザ名を取得しようとしていますが、
ログインユーザ名でなく「SYSTEM」という名前が取得されます。

アプリのmain()関数ではただしくログインユーザ名が取得できるの
ですが、何か異なる点があるのでしょうか。

string machine = Environment.MachineName;
string user = Environment.UserName;

すみませんが、ご教示のほどよろしくお願いいたします。


[ 親 88086 / □ Tree ] 返信 編集キー/

▲[ 88422 ] / ▼[ 88424 ]
■88423 / 12階層)  Re[12]: インストーラ Microsoft SetupProject
□投稿者/ とっちゃん (513回)-(2018/08/29(Wed) 13:51:46)
No88422 (ぽんすけ さん) に返信
> SetUpProjectを利用してインストーラを作成しております。
> カスタム動作を行うためにクラスライブラリを追加し、
> このDLL内で以下のように、ユーザ名を取得しようとしていますが、
> ログインユーザ名でなく「SYSTEM」という名前が取得されます。
>
カスタム動作は、ローカルマシンの「SYSTEM」アカウントで動作するので
アカウント名が、「SYSTEM」になります。

もし、LocalDB をユーザーアカウントで登録させたいのなら
「アプリケーションの初回起動時」
に行う必要があります。
作成されるDBは、昇格していないユーザーのアカウント(マシンの管理者権限がない状態)上で作ります。
なので、それに応じた形で用意することになりますし、同じマシンでも別のユーザーアカウントからは見えません。

そうではなく、マシンアカウントで登録させたいのなら
「インストーラのカスタム動作」
で行う必要があります。
こちらは、逆に特定ユーザーに紐づくように作ると意図しないアカウント上に作られるため
作成自体に注意が必要になります。


DBの内容はわからないのでこれ以上は言及できませんが、LocalDBなので
ファイルアタッチを考えたほうがいいかもしれません。
それなら、開発環境であらかじめ環境に依存しない形でDBを用意しておくということができます。

[ 親 88086 / □ Tree ] 返信 編集キー/

▲[ 88423 ] / ▼[ 88438 ]
■88424 / 13階層)  Re[13]: インストーラ Microsoft SetupProject
□投稿者/ ぽんすけ (21回)-(2018/08/29(Wed) 14:05:41)
No88423 (とっちゃん さん) に返信

とっちゃん様、
早々のご回答誠にありがとうございます!
参考にさせていただき、これから試してみます。

[ 親 88086 / □ Tree ] 返信 編集キー/

▲[ 88424 ] / ▼[ 88722 ]
■88438 / 14階層)  Re[14]: インストーラ Microsoft SetupProject
□投稿者/ ぽんすけ (22回)-(2018/08/30(Thu) 18:11:27)
とっちゃん様

「アプリケーションの初回起動時」にLocalDB をユーザーアカウントで登録させる
ことでうまくいきました。
お忙しいところ、ありがとうございました。
感謝申し上げます。

今後ともよろしくお願いいたします。

解決済み
[ 親 88086 / □ Tree ] 返信 編集キー/

▲[ 88438 ] / ▼[ 88723 ]
■88722 / 15階層)  Re[15]: インストーラ Microsoft SetupProject
□投稿者/ ぽんすけ (41回)-(2018/09/21(Fri) 23:28:53)
2018/09/21(Fri) 23:33:54 編集(投稿者)

No88438 (ぽんすけ さん) に返信
> とっちゃん様
>
> 「アプリケーションの初回起動時」にLocalDB をユーザーアカウントで登録させる
> ことでうまくいきました。
> お忙しいところ、ありがとうございました。
> 感謝申し上げます。

とっちゃん様

上記、インストール時にはうまくいきましたが、結局アンインストール時に
登録したLocalDBは消せないことに気づきました。

今、LocalDBはWindows認証で接続して使っていますが、
もし仮にSQL Server認証にして、初回起動時、CREATE LOGINでユーザ、パスワードを設定して
おいて、 アンインストール時にこのユーザ名、パスワードでログインし、
データベースをDROPするということができるのではと考えたのですが、どうなのでしょうか。

実は試しにこのように修正してみたのですが、
アンインストール時に上手く接続できていないようなのです。
接続文字列が悪いのか、あるいは根本的に無理なのか・・・

また、前にご教示いただきました「マシンアカウントで登録」とはどのような
方法になりますでしょうか。

度々申し訳ございませんが、ご教示お願いいたします。

[ 親 88086 / □ Tree ] 返信 編集キー/

▲[ 88722 ] / ▼[ 88747 ]
■88723 / 16階層)  Re[16]: インストーラ Microsoft SetupProject
□投稿者/ とっちゃん (533回)-(2018/09/22(Sat) 02:40:27)
No88722 (ぽんすけ さん) に返信
> 2018/09/21(Fri) 23:33:54 編集(投稿者)
>
> ■No88438 (ぽんすけ さん) に返信
>>とっちゃん様
>>
>>「アプリケーションの初回起動時」にLocalDB をユーザーアカウントで登録させる
>>ことでうまくいきました。
>>お忙しいところ、ありがとうございました。
>>感謝申し上げます。
>
> とっちゃん様■No88722 (ぽんすけ さん) に返信
> 今、LocalDBはWindows認証で接続して使っていますが、
> もし仮にSQL Server認証にして、初回起動時、CREATE LOGINでユーザ、パスワードを設定して
> おいて、 アンインストール時にこのユーザ名、パスワードでログインし、
> データベースをDROPするということができるのではと考えたのですが、どうなのでしょうか。
>
できるかもしれないしできないかもしれません。

前にも書いていますがDBの構造や、どこにどういう形で用意しているのかという具体的な情報がありませんよね。
その状況でどうなのか?と聞かれても何とも言えないです。

> 実は試しにこのように修正してみたのですが、
> アンインストール時に上手く接続できていないようなのです。
> 接続文字列が悪いのか、あるいは根本的に無理なのか・・・
>
デバッグしましょう。
デバッガを使ってデバッグ実行することだけがデバッグではありません。

エラーが発生したらメッセージボックスを出してできるだけ詳細を表示するというのもデバッグ手法の一つです。
ほかにもいろいろあります(ここでは省略)。



> また、前にご教示いただきました「マシンアカウントで登録」とはどのような
> 方法になりますでしょうか。
>
マシンアカウント(SYSTEM)でDBを登録する形になります。
LocalDBなら、任意のユーザーが読み書きできる %ProgramData% に配置することで対応できるかもしれません。

ただ、複数のユーザーが同じDBを使うことになるので、影響が出ないようにDBを用意しておく必要があります。

[ 親 88086 / □ Tree ] 返信 編集キー/

▲[ 88723 ] / ▼[ 88750 ]
■88747 / 17階層)  Re[17]: インストーラ Microsoft SetupProject
□投稿者/ ぽんすけ (42回)-(2018/09/23(Sun) 11:13:37)
とっちゃん様

すみません、確かに上記の説明では情報が足りませんね。
申し訳ありません。ソースコードから、該当箇所を抜き出しました。


========================================
インストール時に、アプリ初回起動時の処理として、
sqllocaldbにTESTという名前でlocalDBインスタンス生成し、
その後、ログイン、パスワード追加して、
データベース TestDbを生成しております。
以下、初回起動時の処理になります。
※TestDb.mdf、TestDb.ldfは%ProgramData% に配置しております。


            //sqllocaldbにTESTという名前でlocalDBインスタンス生成
            try
            {
                //Processオブジェクトを作成
                Process p = new Process();

                //ComSpec(cmd.exe)のパスを取得して、FileNameプロパティに指定
                p.StartInfo.FileName = Environment.GetEnvironmentVariable("ComSpec");
                //出力を読み取れるようにする
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.RedirectStandardInput = false;

                //ウィンドウを表示しないようにする
                p.StartInfo.CreateNoWindow = true;
                //コマンドラインを指定("/c"は実行後閉じるために必要)
                p.StartInfo.Arguments = @"/c sqllocaldb create TEST";

                //起動
                p.Start();

                //出力を読み取る
                String results = p.StandardOutput.ReadToEnd();

                //プロセス終了まで待機する
                //WaitForExitはReadToEndの後である必要がある
                //(親プロセス、子プロセスでブロック防止のため)
                p.WaitForExit();
                p.Close();
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message);
            }

            //接続して、ログイン、パスワード追加
            string ConnectionStr = @"Data Source=(localdb)\TEST;Integrated Security=true;Trusted_Connection=yes;Connection Timeout=60;Pooling=True;Database=master";

            SqlConnection con = new SqlConnection(ConnectionStr);
            try
            {
                con.Open();
            }
            catch (Exception e)
            {
                System.Windows.Forms.MessageBox.Show(e.Message);
                throw (e);
            }
            var command = con.CreateCommand();

            StringBuilder sbSql = new StringBuilder();

            sbSql.AppendLine("CREATE LOGIN abc WITH PASSWORD = 'abc1234'");
            sbSql.AppendLine("CREATE USER abc FOR LOGIN abc");
            command.CommandText = sbSql.ToString();
            command.ExecuteNonQuery();
            sbSql.Clear();


            command.CommandText =
              "SELECT COUNT(*) FROM sysdatabases WHERE name='TestDb'";
            int count = (int)command.ExecuteScalar();

            //インスタンスにTestDbが残っている
            if (count > 0)
            {
        //一旦デタッチ
                command.CommandText = String.Format("exec sp_detach_db 'TestDb'");
                command.ExecuteNonQuery();

                sbSql.Clear();
            }

            sbSql.AppendLine("EXEC sp_configure 'contained database authentication', 1 ");
            sbSql.AppendLine("RECONFIGURE ");
            command.CommandText = sbSql.ToString();

            command.ExecuteNonQuery();
            con.Close();


            sbSql.Clear();


            //ログインする
            ConnectionStr = @"Data Source=(localdb)\TEST;Integrated Security=true;User ID=abc;Password=abc1234;Trusted_Connection=yes;Connection Timeout=60;Pooling=True;Database=master";

            con = new SqlConnection(ConnectionStr);

            try
            {
                con.Open();
            }
            catch (Exception e)
            {
                System.Windows.Forms.MessageBox.Show(e.Message);
                throw (e);
            }
            command = con.CreateCommand();

            //データベース TestDbを生成
            sbSql.AppendLine("CREATE DATABASE [TestDb]");
            sbSql.AppendLine(" CONTAINMENT = PARTIAL");
            sbSql.AppendLine(" ON  PRIMARY ");

            sbSql.AppendLine(@"( NAME = N'TestDb', FILENAME = N'" +  "TestDb.mdf" + "' , SIZE = 73728KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )");
            sbSql.AppendLine(" LOG ON ");
            sbSql.AppendLine(@"( NAME = N'TestDb_Log', FILENAME = N'" + "TestDb.ldf" + "' , SIZE = 8384KB , MAXSIZE = UNLIMITED, FILEGROWTH = 10%)");
            sbSql.AppendLine("COLLATE Japanese_XJIS_100_CS_AS_KS_WS ");
            command.CommandText = sbSql.ToString();
            command.ExecuteNonQuery();
            sbSql.Clear();


以上が、初回起動時の処理で行っている箇所になります。
このあと、テーブルも生成しております。
==============================================================================

アンインストール時にlocalDB "TEST"に接続して、"TestDb"をDROPしようとしました。
「Drop TestDb Database    1」までメッセージは表示されますが、
openで失敗しております。
前に書いておりました「アンインストール時に上手く接続できていない」っていうのが、
ここになります。

以下、Setup Project カスタム動作でのアンインストール時の処理になります。


            System.Windows.Forms.MessageBox.Show("DropTestDbDatabase");
            string ConnectionStr = @"Data Source=(localdb)\TEST;Integrated Security=true;User ID=abc;Password=abc1234;Trusted_Connection=yes;Connection Timeout=60;Pooling=True;Database=master";

            SqlConnection con = new SqlConnection(ConnectionStr);
            try
            {
                System.Windows.Forms.MessageBox.Show("Drop TestDb Database    1");
                con.Open();

                System.Windows.Forms.MessageBox.Show("Drop TestDb Database    2");
                var command = con.CreateCommand();
                System.Windows.Forms.MessageBox.Show("Drop TestDb Database    3");

                StringBuilder sbSql = new StringBuilder();

                sbSql.AppendLine("DROP DATABASE [TestDb]");
                command.CommandText = sbSql.ToString();
                command.ExecuteNonQuery();
                sbSql.Clear();
                System.Windows.Forms.MessageBox.Show("Drop TestDb Database    4");

                con.Close();
            }
            catch (Exception e)
            {
                System.Windows.Forms.MessageBox.Show(e.Message);
                throw (e);
            }
            System.Windows.Forms.MessageBox.Show("Drop TestDb Database    5");
        }
========================================

アプリ起動して、DBの参照ができることは確認しておりますが、
アンインストール時にDROPが出来ておりません。

LocalDBの扱い方に問題があるのでしょうか。
度々申し訳ございませんが、ご教示お願いいたします。

 

[ 親 88086 / □ Tree ] 返信 編集キー/

▲[ 88747 ] / ▼[ 88751 ]
■88750 / 18階層)  Re[18]: インストーラ Microsoft SetupProject
□投稿者/ とっちゃん (534回)-(2018/09/23(Sun) 17:34:14)
No88747 (ぽんすけ さん) に返信
> とっちゃん様■No88747 (ぽんすけ さん) に返信
> 以下、初回起動時の処理になります。
> ※TestDb.mdf、TestDb.ldfは%ProgramData% に配置しております。

ProgramData の直下ではなく
会社名や、アプリ名など、ユニークになるであろうサブフォルダに格納することをお勧めします。


昨今の状況では、会社名\バージョン依存アプリ名、会社名\バージョン非依存アプリ名、会社名だけ、アプリ名だけ
などまちまちなので、どういう形が望ましいというものはあまりないようです。
自分のマシンでの使われ方などを参考に考えてください。

AppDataと同じ使い方でも問題はないと思います。


>//コマンドラインを指定("/c"は実行後閉じるために必要)
>p.StartInfo.Arguments = @"/c sqllocaldb create TEST";
>
これを行っているということは、TestDb.mdf/ldf の情報とは別のものを使っているということになると思います。
mdf/ldf は事前に作ったDB(要するにテーブルと中身)を使う方法です。

また、その場でDBを作るなら共有インスタンス(マシン内の複数ユーザーで使うインスタンス)にする必要があると思います。


>//接続して、ログイン、パスワード追加
>string ConnectionStr = @"Data Source=(localdb)\TEST;Integrated Security=true;Trusted_Connection=yes;Connection Timeout=60;Pooling=True;Database=master";

とりあえず、一番最初の接続文字列を引っ張っていますが。。。

ファイル参照させるなら
「AttachDbFileName=ファイルパス」
でパス指定する必要があるはずです。

前に、LocalDBを使ったら?とあったスレッドでもいろいろ情報出ていたと思います。

SQL Server は、自分で使わないのでこれ以上の詳しいことはよくわかりませんので、このスレッドでの回答はあまり望めないと思います。


それと、もう一つ考えておかなければならないものがあります。

以下の状況でDBをどうするのか?を考える必要があります。
1. アプリをアンインストールしてインストールしなおした場合
2. アプリをアップデートした場合

1の時にDBは消えたほうがいいのか消えたら困るのか?
同様に2の時はどうなのか?


今の状況で正しく動いたとすれば最低でも1の時は必ず消えていることになります。
(アンインストールで消しているため)。

そして、1の状況で正しく消えるという場合、ほぼ間違いなく2の状況でも消えます。

これは、アップデートの仕組みに基づいているのですが、インストールしてアンインストールまたは
アンインストールしてインストールという処理を1回のアップデートインストール時にまとめて行うからです。

どういうパターンの場合でもアンインストールという処理が行われるため
アンインストール時にDBを消すという処理が行われた場合、
結果として、アップデート時にもそのDBはなくなってしまうことになります。


[ 親 88086 / □ Tree ] 返信 編集キー/

▲[ 88750 ] / ▼[ 88764 ]
■88751 / 19階層)  Re[19]: インストーラ Microsoft SetupProject
□投稿者/ ぽんすけ (43回)-(2018/09/23(Sun) 21:44:04)
No88750 (とっちゃん さん) に返信
とっちゃん様

ご返信いただきありがとうございます。
いつもお手数をお掛けして申し訳ありません。
DBファイルの格納先につきましては、もう少し考えて配置するようにします。

共有インスタンスにすることにつきましては、確かに複数ユーザで
使用するため、そのように変更いたします。

あと、考えておかなければならないことについて、
1.のアンインストール後の再インストールについては、DBは消えててもよいのですが、
2.のアプリのアップデートの場合には消えないでほしいと思っておりました。
ご説明いただいた内容によれば、これはできなさそうですね・・・。
アンインストール時に消すか、あるいは残しておくか。。。
もう少し検討してみたいと思います。

ほんとにいつもありがとうございます。
では失礼いたします。

[ 親 88086 / □ Tree ] 返信 編集キー/

▲[ 88751 ] / 返信無し
■88764 / 20階層)  Re[20]: インストーラ Microsoft SetupProject
□投稿者/ とっちゃん (535回)-(2018/09/25(Tue) 16:51:17)
No88751 (ぽんすけ さん) に返信
> 共有インスタンスにすることにつきましては、確かに複数ユーザで
> 使用するため、そのように変更いたします。
>
複数のユーザーが利用する場合、同じDBに書き込んで大丈夫ですか?
「同じDBに書き込む==ほかの人が書いた内容でも読める」
ということになります。

もちろん、ユーザーごとの固有値をセットしておけば同じDBでも絞り込みできるから
大きな問題はありませんが(カラムにログオンIDなどを用意しておいて、検索時には where で絞ればいいだけ)。

> あと、考えておかなければならないことについて、
> 1.のアンインストール後の再インストールについては、DBは消えててもよいのですが、
> 2.のアプリのアップデートの場合には消えないでほしいと思っておりました。
> ご説明いただいた内容によれば、これはできなさそうですね・・・。
> アンインストール時に消すか、あるいは残しておくか。。。
> もう少し検討してみたいと思います。
>
アンインストールが完全に使用終了を指す場合のアンインストールであればデータファイルに当たるものは
一緒に消えたほうが便利だと思いますが、

ほとんどすべてのアプリで、AppDataフォルダや、ProgramData に書き込んだファイルは残したままです。
バージョンアップ時に古いものを削除(新しいところに吸い上げ)ということはありますが
それ自体が珍しいほうです。

商用アプリも、個人用アプリも。

このあたりが、UWP アプリでは残らないといううたい文句につながっていたりします(レジストリも同様)。

[ 親 88086 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -