【.NET5】dotnet.exeでclasslibを他のプロジェクトから参照する。

C#コンピュータ
C#

WinFormでプログラムを作成している最中に、プロジェクト内で利用しているクラスをコンソール(プロジェクト)で簡易テストしたい場面があり、クラスライブラリとしてほかのプロジェクトから参照する方法を調べてみました。

スポンサーリンク

classlibプロジェクトの作成

以下PowerShellで実行

mkdir MyLib
cd MyLib
dotnet new classlib
code .

テキストエディタ(VScode)でテスト用メソッドFoo()を作成。
ファイル名:Class1.cs

using System;

namespace MyLib
{
    public class Class1
    {
        public static string Foo()
        {
            return "Foo";
        }
    }
}

consoleプロジェクトの作成しclasslibプロジェクトを参照

mkdir ../MyConsole
cd mkdir ../MyConsole
dotnet new console
dotnet add reference ../MyLib
code .

テキストエディタ(VScode)でテスト用メソッドFoo()を呼び出すプログラムをコーディング。
ファイル名:Program.cs

using System;

namespace MyConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(MyLib.Class1.Foo());
        }
    }
}

実行すると、コンソールに「Foo」文字列が表示される。

MyConsole.csprojを覗いてみると「MyLib」を参照している項目が見つかった。

<Project Sdk="Microsoft.NET.Sdk">

  <ItemGroup>
    <ProjectReference Include="..\MyLib\MyLib.csproj" />
  </ItemGroup>

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>

</Project>

WPFプロジェクトの作成しclasslibプロジェクトを参照

mkdir ../MyWPF
cd ../MyWPF
dotnet new wpf
dotnet add reference ../MyLib
code .

ラベルにClass1.Foo()の結果を表示
ファイル名:MainWindow.xaml

<Window x:Class="MyWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MyWPF"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.DataContext>
        <local:MainWindowViewModel />
    </Window.DataContext>
    <Grid>
        <Label Content="{Binding Foo}" FontSize="64" VerticalAlignment="Center" HorizontalAlignment="Center" />
    </Grid>
</Window>

ファイル名:MainWindowViewModel.cs

using System.ComponentModel;

namespace MyWPF
{
    class MainWindowViewModel : INotifyPropertyChanged
    {
        public MainWindowViewModel()
        {
            PropertyChanged += (o, e) => {};
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string name)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }

        private string _foo = MyLib.Class1.Foo();

        public string Foo
        {
            get
            {
                return _foo;
            }
            set
            {
                if (_foo == value) return;
                _foo = value;
                OnPropertyChanged("Foo");
            }
        }
    }
}

実行するとFooと表示される。

ASP.NET MVCプロジェクトの作成しclasslibプロジェクトを参照

mkdir ../MyMVC
cd ../MyMVC
dotnet new mvc
dotnet add reference ../MyLib
code .

ファイル名:Views/Home/Index.cshtml

@{
    ViewData["Title"] = "Home Page";
    ViewData["AAA"] = MyLib.Class1.Foo();
}

<div class="text-center">
    <h1 class="display-4">@ViewData["AAA"]</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

実行するとFooと表示される。

WinFormプロジェクトの作成しclasslibプロジェクトを参照

mkdir ../MyWinForm
cd ../MyWinForm
dotnet new winforms
dotnet add reference ../MyLib
code .

ファイル名:Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MyWinForm
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            var txtBox = new TextBox
            {
                Dock = DockStyle.Fill,
                Text = MyLib.Class1.Foo(),
            };
            this.Controls.Add(txtBox);
        }

    }
}

実行するとテキストボックスにFooと表示される。

UnitTestプロジェクトの作成しclasslibプロジェクトを参照

mkdir ../MyTest
cd ../MyTest
dotnet new mstest
dotnet add reference ../MyLib
code .

ファイル名:UnitTest1.cs

using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace MyTest
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            Assert.AreEqual<string>("Foo", MyLib.Class1.Foo());
        }
    }
}

実行

dotnet test
...省略...
テスト実行を開始しています。お待ちください...
合計 1 個のテスト ファイルが指定されたパターンと一致しました。

成功!   - Failed:     0, Passed:     1, Skipped:     0, Total:     1, Duration: 5 ms- MyTest.dll 
(net5.0)

まとめ

いくつかのプロジェクトで試してみましたが基本的にプロジェクトフォルダ内でdotnet reference classlibプロジェクトのパスで参照することが確認出来ました。

コメント