none
追質問:WPFのWindowをDLLし共有したい RRS feed

  • 質問


  • VS2010+VB.netで、WPF関連スレッドの過去の質問 (2014年7月27日)↓ と同じことをしたいと思っています。
    https://social.msdn.microsoft.com/Forums/ja-JP/c376d046-6169-4b34-865d-46abacc6d7f3/wpfwindowdll?forum=wpfja

    この中での回答:
    >DLLのプロジェクトを「WPF ユーザーコントロール ライブラリ」として、そのプロジェクトに新しい項目としてウィンドウを追加することでWindowを内部に持ったDLLができますよ。
    あとはそのプロジェクトを参照するか、ビルドで出来上がったdllを参照します。

    ↑ これは問題なくできました。しかし、これでは単体でテストできないので、

    >あるいはexeプロジェクトのままでも参照できるので先に共通のウィンドウをexeで作ってしまうこともできます。

    ↑ この方法を採用することにしました。しかし、

    >さらに、できあがったらプロジェクトのプロパティで出力の形式をクラスライブラリに変更してdllにできます。この方法の場合はapp.xamlが邪魔になるので、app.xamlのビルドアクションを「なし」に変更するか削除する必要があります。

    ↑ この方法の一つ、app.xamlを削除したら元に戻せなくなり、コンパイルエラーが大量に出てデバッグできなくなってしまいました。

    質問ですが、VSのプロジェクトのプロパティー→アプリケーション→アプリケーションの種類 の設定を
    WPFアプリケーション ←→ WPFクラスライブラリ で切り替える際に、コンパイルエラーを出さずにスムースに行う方法を、分かり易く教えて下さい。

    http://www.atmarkit.co.jp/ait/articles/1511/04/news027.html
    ↑ この方法が参考になったのですが、app.InitializeComponent()がVB.netでコンパイルエラーになります。このサイトの内容は信用できません。
    2017年6月29日 0:01

回答

  • Windowsアプリケーションの場合はapp.xamlが必要ですし、クラスライブラリの場合にはapp.xamlが邪魔になるというだけです。
    よって、クラスライブライの場合にはapp.xamlを削除するか、app.xamlを「プロジェクトから除外」するか、app.xamlのビルドアクションを「なし」にするかです。削除すれば元に戻せなくなりますので、削除する場合はオリジナルのプロジェクトを丸ごとコピーし、そこからクラスライブラリを作成することが前提となります。

    他のプロジェクトから参照されるプロジェクトはそれ用のソリューションとして独立させ、そこでクラスライブラリを作成したい場合のみに、アプリケーションの種類をクラスライブラリにし、app.xamlのビルドアクションを「なし」に一時的に変更してはいかがでしょうか? その後、また、プロジェクトの種類ををWindowsアプリケーションにし、app.xamlのビルドアクションをApplicationDefinitionに戻しておけば良いような気がします。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク huahi11112 2017年6月29日 8:05
    2017年6月29日 1:43
    モデレータ

すべての返信

  • // 直接の回答ではありません。

    DLLはDLLとしてはじめから作成しておき、そのDLLを動作確認したいのであれば、それを動かす用のテストプロジェクトをソリューション内に一つ作成し、DLLプロジェクトを参照させてそこに定義されているWindowをShowしたりすればいいのではないでしょうか。

    そうすれば、例えばEXEとして動かしたときには問題なかったのにDLLとして動かしたときに実行時エラーが出る、なんてことも原理的に起こりませんし。

    2017年6月29日 1:00
  • Windowsアプリケーションの場合はapp.xamlが必要ですし、クラスライブラリの場合にはapp.xamlが邪魔になるというだけです。
    よって、クラスライブライの場合にはapp.xamlを削除するか、app.xamlを「プロジェクトから除外」するか、app.xamlのビルドアクションを「なし」にするかです。削除すれば元に戻せなくなりますので、削除する場合はオリジナルのプロジェクトを丸ごとコピーし、そこからクラスライブラリを作成することが前提となります。

    他のプロジェクトから参照されるプロジェクトはそれ用のソリューションとして独立させ、そこでクラスライブラリを作成したい場合のみに、アプリケーションの種類をクラスライブラリにし、app.xamlのビルドアクションを「なし」に一時的に変更してはいかがでしょうか? その後、また、プロジェクトの種類ををWindowsアプリケーションにし、app.xamlのビルドアクションをApplicationDefinitionに戻しておけば良いような気がします。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク huahi11112 2017年6月29日 8:05
    2017年6月29日 1:43
    モデレータ
  • trapemiyaさんの回答が参考になりました。


    ◆ WPF Windowを持つフォームのdllを作成するには
    VS WPFアプリケーションのソリューションを新規作成し、exeファイルを完成させる。
    app.xamlのプロパティーでビルドアクションを「なし」にする。
    プロジェクトのプロパティー→アプリケーション→アプリケーションの種類をWPF クラスライブラリーにする。
    ビルドメニューからビルドを行う。→dllファイルが生成される。

    ◆ WPFアプリケーションに戻してデバッグを行うには
    app.xamlのプロパティーでビルドアクションを「ApplicationDefinition」にする。
    プロジェクトのプロパティー→アプリケーション→アプリケーションの種類をWPF アプリケーションにする。

    以上の方法で生成ファイルをexe←→dllで切り替えて使うということがわかりました。
    非常に役に立つ御回答でした。どうもありがとうございました。
    2017年6月29日 8:05