VB のたまご

作成日: 2017/03/20, 更新日: 2017/04/29



Livet アプリケーション作成時の注意

  •  次の学習に入る前に、Livet アプリケーションを扱う際の注意事項を、いくつかシェアしたいと思います。

  • スポンサーリンク



その1

  •  新規プロジェクト作成時は気にしなくていいのですが、プロジェクト追加で「Livet WPF4.5 MVVM アプリケーション」を追加した際、 追加したプロジェクトを「スタートアッププロジェクトに設定」するのはもちろんなのですが、これ以外に、 ビルドリストの対象外になっていますので、対象にするように設定を変更する必要があります。

  •  「ソリューションエクスプローラー」より「ソリューション名」を右クリック→「構成マネージャー」→ 構成マネージャー画面が表示されるので、一覧の中から追加した「追加したプロジェクト名」を見つけて、該当する「ビルド」セルにチェックを付けます。

  • イメージ

スポンサーリンク


その2

  •  Livet アプリケーションでは、プログラム構成にもよりますが、初期状態でプログラムを作る場合は、名前空間を使います。 プロジェクト名前空間のことではなくて、その下にぶら下がる論理的に区切った名前空間のことです。 こういうやつですね。

  • Namespace Logics
    
        Public Class Class1
        End Class
    
    End Namespace
    

  •  VB.NET だと、クラスを新規作成しても名前空間は記載されていないから、あまり使われることはないのかなと思います。

  •  例えば、整理整頓を目的に、プロジェクト直下にフォルダを追加して、関連ソースをこの中に移動、または作成したとします。 あくまでも、整理整頓が目的なので、ソースのパスが変わったとしても、論理的な名前空間は変わっていません。プロジェクト名前空間+クラス名のままです。 このフォルダに入っているソース(のクラス)を扱う場合でも、フォルダの外で管理しているソース(のクラス)と、名前空間は同じままです。

  •  これが C# の場合だと、フォルダ名=1つの名前空間という扱いになります。 すなわち、プロジェクト名前空間+フォルダ名と同名の名前空間+クラス名という考え方になり、名前空間も変わります。 以下は、Logics というプロジェクト名として、プロジェクト直下に Commons フォルダを作成して、その中に Class1.cs を作成した場合です。 このクラスの名前空間は、Logics.Commons.Class1 になります。

  • namespace Logics.Commons
    {
        public class Class1
        {
        }
    }
    

  •  ソース追加による新規作成時は、Visual Studio が自動的に書いてくれますし、ソースを移動してきた場合は手動で書き換えます。 物理的な移動は、論理的な名前空間の変更でもあります。

  •  Livet アプリケーションを扱う場合は、この C# の方の考え方で作る必要があります。さらに VB.NET の場合、プロジェクト名前空間は省略します(自動的に頭に付与されるので)。 よって、上記と同じ名前空間にするにはこう書きます。 以下も、プロジェクト名が Logics の場合であれば、Logics.Commons.Class1 になります。

  • Namespace Commons
    
        Public Class Class1
        End Class
    
    End Namespace
    

  •  これを踏まえて、以前「Livet WPF4.5 MVVM アプリケーション」を作成しましたが、プロジェクト直下にフォルダがあるんですよね。 MVVM それぞれの層に対応したフォルダが用意されています。このフォルダは、整理整頓の意味もありますが、「名前空間で区切る」という役目も果たしています。

  •  Views フォルダ内に作成した画面は、こういう感じで書かれています。

  • Namespace Views
        Public Class MainWindow
        End Class
    End Namespace
    

  •  ViewModels や Models フォルダ内に作成したクラスも同様です。

  • Namespace ViewModels
        Public Class MainWindowViewModel
        End Class
    End Namespace
    

    Namespace Models
        Public Class Person
        End Class
    End Namespace
    

  •  それで、C# と同じように、ソースを新規追加した場合、名前空間が書いていると思いきや、名前空間は書かれていません。 これは各層同じですので(フォルダの中にソースを追加するのは、どのフォルダでも同じ)、手動で名前空間を書いていく必要があります。 これはもうしょうがないので、そういうものだと思いこむしかないです。

  •  それでは見ていきましょう。

  •  Views の場合

  •  Views フォルダに、「Livet WPF4 ウィンドウ」を「Window1.xaml」という名前で追加したとします。 Xaml にはフォルダ名部分の名前空間の追加、コードビハインドには名前空間定義の追加をします。

  • イメージ
  •  Xaml 上で、Window.DataContext タグ内に、画面名+ViewModel のクラスをバインドするように書かれてあり、そのクラス(というかソース)が存在しないため、 エラーになっていますが、こちらは次に作成するので放置します。

  •  ViewModels の場合

  •  ViewModels フォルダに、「Livet WPF4 ビュー・モデル」を「Window1ViewModel.vb」という名前で追加したとします。 クラスに名前空間定義の追加をします。

  • イメージ

  •  Models の場合

  •  Models フォルダに、「Livet WPF4 モデル」を「Person.vb」という名前で追加したとします。 クラスに名前空間定義の追加をします。

  • イメージ

  •  このように、名前空間を意識して忘れないようにしてください。


その3

  •  このサンプルは GitHub 上にアップロードしています。

  • GitHub
    https://github.com/sutefu7/NETFrameworkDifferenceError
    Src/
    

  •  「Livet WPF4.5 MVVM アプリケーション」でターゲットにしているフレームワークは、.NET Framework 4.5 です。 ある機能をクラスライブラリとして外部にまとめたい場合、クラスライブラリのプロジェクトを作成しますが、この時ターゲットにしているフレームワークのバージョンが、.NET Framework 4.5.2 以降になっている可能性があります。

  •  各プロジェクトの .NET Framework のバージョンが違うとプロジェクト間での連携ができなくなる可能性があります。 以下のサンプルでは、アプリケーションとして「Livet WPF4.5 MVVM アプリケーション」を、ライブラリとして「クラスライブラリ」として作成後、LivetCask を NuGet 取得してきたプロジェクトの構成です。

  •  アプリケーション側で、クラスライブラリを参照追加して、クラスライブラリにあるユーザーコントロールを使おうとします。 ユーザーコントロールをタグ書き後、ビルドした際に出たエラーです。

  • 1>------ すべてのリビルド開始: プロジェクト:ClassLibrary1, 構成:Debug Any CPU ------
    2>------ すべてのリビルド開始: プロジェクト:NETFrameworkDifferenceError, 構成:Debug Any CPU ------
    2>  NETFrameworkDifferenceError -> C:\~\NETFrameworkDifferenceError\bin\Debug\NETFrameworkDifferenceError.exe
    1>  ClassLibrary1 -> C:\~\ClassLibrary1\bin\Debug\ClassLibrary1.dll
    3>------ すべてのリビルド開始: プロジェクト:LivetWPFApplication1, 構成:Debug x86 ------
    3>C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): warning MSB3274: プライマリ参照 "C:\~\ClassLibrary1\bin\Debug\ClassLibrary1.dll" は、".NETFramework,Version=v4.5.2" フレームワークに対して作成されているため、解決できませんでした。これは現在ターゲットされているフレームワーク ".NETFramework,Version=v4.5" よりも新しいバージョンです。
    3>C:\~\LivetWPFApplication1\Views\MainWindow.xaml(31,10): error MC3074: タグ 'UserControl1' は、XML 名前空間 'clr-namespace:ClassLibrary1.Views;assembly=ClassLibrary1' にありません。 行 31 位置 10.
    ========== すべてリビルド: 2 正常終了、1 失敗、0 スキップ ==========
    

    error MC3074: タグ 'UserControl1' は、XML 名前空間 'clr-namespace:ClassLibrary1.Views;assembly=ClassLibrary1' にありません。
    

  •  実際には、エラー内容の名前空間内に、UserControl1 は存在します。 謎すぎてハマってしまいましたが、1つ前の行で「警告」として、フレームワークのバージョンが不一致ですよ。と教えてくれていました。 と言うか、参照設定してビルドした時点で出ていたエラーみたいでした。気づきませんでした。

  • warning MSB3274: プライマリ参照 "C:\~\ClassLibrary1\bin\Debug\ClassLibrary1.dll" は、".NETFramework,Version=v4.5.2" フレームワークに対して作成されているため、解決できませんでした。
    これは現在ターゲットされているフレームワーク ".NETFramework,Version=v4.5" よりも新しいバージョンです。
    

  •  警告の言っている通り、ターゲットフレームワークをどちらかに合わせて変更して、バージョンを一致させることでエラーや警告が出なくなります。