ユーザ用ツール

サイト用ツール


サイドバー

プログレス合同会社

広告

windows:vs:cs:library:core

01.Coreプロジェクトの作成

Microsoft AccessVBAC#アプリケーションのNuGetで利用できるようにするため、ロジックとアダプターにプロジェクトを分離します。

ロジック部分をCoreプロジェクトとして作成します。

windows:vs:newsolution.png

Visual Studio

新しいプロジェクトの作成(N)』でプロジェクトの作成を開始します。

windows:vs:cs:library:core0101.png

テンプレートの選択

C#Windowsライブラリでフィルターして、『.NETまたは.NET Standardを対象とするクラスライブラリ』を選択します。

次へ(N)』で次に進みます。

windows:vs:cs:library:core0102.png

プロジェクトの構成

プロジェクト名はCore、ソリューション名はライブラリ名にしています。

ソリューションは複数のプロジェクトで構成しますので、『ソリューションとプロジェクトを同じディレクトリに配置する(D)』のチェックボックスは必ず外します

次へ(N)』で次に進みます。

windows:vs:cs:library:core0103.png

フレームワークの選択

Coreプロジェクトでは、最新のフレームワークを選択して構いません。
プロジェクト作成後に.NET Frameworkでも参照できるように設定します。

作成(C)』でプロジェクトが作成されます。

自動で生成されるClass1.csを削除します。

署名用ファイル作成

作成するライブラリは、パソコン内のすべてのアプリケーションから参照させる必要がないため、GAC(Global Assembly Cache)に配置させず、RegAsmを使用してレジストリに配置先ディレクトリを登録するようにします。

レジストリ登録時の警告を回避するため、署名用のファイルを作成します。
※警告を無視してもいい場合は署名用ファイルを作成する必要はありません。

Visual Studioのツールバーから『ツール(T)』➡『コマンドライン(L)』➡『開発者用PowerShell(P)』で開発者用PowerShellを起動します。

sn -k OAuthLib.snk

1行目
署名用キーペアをOAuthLib.snkに作成します。

ソリューション共有定義の作成

全プロジェクトで共有する定義を作成します。

windows:vs:cs:library:core0201.png

ソリューションエクスプローラー

ソリューション』➡『追加(D)』➡『新しい項目(W)…』で『Directory.Build.props』ファイルを追加します。

<Project>
  <PropertyGroup>
    <Version>XX.XX.XX.XX</Version>
  </PropertyGroup>
  <PropertyGroup>
    <RootPackageId>ProgressLLC.OAuthLib</RootPackageId>
    <Company>プログレス合同会社</Company>
    <AssemblyTitle>$(Company) OAuth 2.0 操作ライブラリ</AssemblyTitle>
    <Title>ProgressLLC OAuth 2.0 Library</Title>
    <Description>$(Title)</Description>
    <Product>$(RootPackageId)</Product>
    <Authors>Progress LLC (progress-llc.co.jp)</Authors>
    <Copyright>Copyright $(Authors)</Copyright>
    <IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion>
    <SnKeyFile>..\OAuthLib.snk</SnKeyFile>
  </PropertyGroup>
  <PropertyGroup>
    <ComAssemblyName>$(RootPackageId.Replace(".",""))</ComAssemblyName>
    <NuGetAssemblyName>$(RootPackageId)</NuGetAssemblyName>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)' == 'Release'">
    <DebugType>none</DebugType>
  </PropertyGroup>
  <PropertyGroup>
    <LangVersion>latest</LangVersion>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>
</Project>

2行目~4行目
ソリューション全体で同じバージョンになるようにここで定義します。
5行目~15行目
.dll.nupkgのファイル情報を定義します。
14行目
バージョンにGitハッシュが自動付与されないようにしています。
15行目
署名ファイルを定義しています。
17行目~20行目
COMNuGetのAssemblyName名を定義しています。
COMのアセンブリ名では.(ドット)が_(アンダースコア)に変換されるため、.(ドット)を削除しています。
21行目~23行目
Releaseビルドではデバッグ用のファイル(.pdb等)を作成しないようにしています。
24行目~28行目
共通となる言語仕様を定義しています。


※弊社の定義を例にしていますので、適宜変更してください。

Coreプロジェクトの定義を作成

下記のいずれかの方法でCoreプロジェクトのプロジェクトファイルを開いて編集します。

  • ソリューションエクスプローラーでプロジェクト名をダブルクリック
  • ソリューションエクスプローラーでプロジェクト名を右クリック➡プロジェクトファイルの編集

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;net10.0</TargetFrameworks>
    <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
  </PropertyGroup>
  <PropertyGroup>
    <PackageId>$(RootPackageId).Core</PackageId>
    <RootNamespace>$(PackageId)</RootNamespace>
    <AssemblyName>$(PackageId)</AssemblyName>
    <SignAssembly>false</SignAssembly>
  </PropertyGroup>
</Project>

3行目
Comプロジェクト用のnetstandard2.0NuGetプロジェクト用の.netx.xのマルチフレームワークで作成します。
4行目
依存パッケージのアセンブリを出力フォルダーにコピーします。
7行目~9行目
アセンブリ情報を定義しています。
10行目
単体のアセンブリには署名しません。

ILRepackのインストール

Coreプロジェクトの最終出力アセンブリは、上位のComNuGetプロジェクトで参照するパッケージとの競合を避けるため、プロジェクトで参照しているパッケージをすべて一つにまとめたものにします。

一つにまとめるためILRepackをインストールします。

windows:vs:cs:library:core0301.png

ソリューションエクスプローラー

Core』を右クリック➡『NuGetパッケージの管理(N)…』でNuGetパッケージマネージャーを開きます。

windows:vs:cs:library:core0302.png

NuGetパッケージマネージャー

nuget.org』の『参照』タブでILRepack.Lib.MSBuild.Taskを選択します。

windows:vs:cs:library:core0303.png

ILRepack.Lib.MSBuild.Task

インストール』をクリックします。

windows:vs:cs:library:core0304.png

変更のプレビュー

インストールするパッケージを確認して『適用』をクリックします。

Coreプロジェクトの定義を変更/追加します。

   :
  <ItemGroup>
    <PackageReference Include="ILRepack.Lib.MSBuild.Task" Version="x.x.xx.x">
      <GeneratePathProperty>true</GeneratePathProperty>
      <PrivateAssets>all</PrivateAssets>
      <ExcludeAssets>build; buildTransitive</ExcludeAssets>
  </ItemGroup>
  <UsingTask TaskName="ILRepack"
             AssemblyFile="$(PkgILRepack_Lib_MSBuild_Task)\build\ILRepack.Lib.MSBuild.Task.dll" />
  <Target Name="MergeDependencies" AfterTargets="Build" Condition="'$(TargetFramework)' != ''">
    <ItemGroup>
      <DependencyAssemblies Include="$(TargetDir)*.dll" Exclude="$(TargetDir)$(TargetFileName)" />
      <MergeList Include="$(TargetDir)$(TargetFileName);@(DependencyAssemblies)" />
    </ItemGroup>
    <ILRepack Condition="'@(MergeList)' != ''"
              Parallel="true"
              Internalize="true"
              InputAssemblies="@(MergeList)"
              TargetKind="SameAsPrimaryAssembly"
              OutputFile="$(TargetDir)$(TargetFileName)"
              LibraryPath="$(TargetDir)"
              KeyFile="$(SnKeyFile)" />
    <Delete Files="@(DependencyAssemblies)" />
    <Message Text="[Success] Merged $(TargetFramework) for $(TargetFileName)" Importance="high" />
  </Target>  
   :

3行目~6行目
ILRepack.Lib.MSBuild.Taskの定義を置き換えます。
4行目
ILRepackdllが存在するパスの変数を生成します。
6行目
ILRepackの自動実行タスクを無効にします。
8行目~9行目
ILRepackタスクの実行で使用するdllを定義します。
10行目~25行目
実行するタスクを定義します。
11行目~14行目
一つにまとめる対象パッケージを定義します。
Coreプロジェクトの単体dllを先頭にして参照パッケージを追加しています。
17行目
参照パッケージのアクセス修飾子を強制的にinternalにします。
22行目
署名します。

インターフェース定義の作成

インターフェース定義を作成します。

インターフェース定義と実装クラスはsrcフォルダーにまとめています。

namespace ProgressLLC.OAuthLib.Core
{
  internal interface IOAuth
  {
    public string TokenDir         { get; set; }
    public string AuthorizeHost    { get; set; }
    public string AuthorizePath    { get; set; }
    public string TokenPath        { get; set; }
    public string ClientId         { get; set; }
    public string ClientSecret     { get; set; }
    public string CallbackUrl      { get; set; }
    public bool   GetAuthorizeCode();
    public string GetAccessToken();
  }
}

3行目
他のアセンブリにインターフェースを隠蔽するためinternalにしています。
Core.csprojInternalsVisibleToでフレンドアセンブリとして定義しているアセンブリはアクセスできます。

クラス実装の作成

クラスの実装を作成します。

namespace ProgressLLC.OAuthLib.Core
{
  internal class OAuth : IOAuth
  {
    private static readonly HttpClient httpClient;

    public string TokenDir      { get; set; }
    public string AuthorizeHost { get; set; }
    public string AuthorizePath { get; set; }
    public string TokenPath     { get; set; }
    public string ClientId      { get; set; }
    public string ClientSecret  { get; set; }
    public string CallbackUrl   { get; set; }
    public OAuth()
    {
    }
  }
}

3行目
他のアセンブリにインターフェースを隠蔽するためinternalにしています。
Core.csprojInternalsVisibleToでフレンドアセンブリとして定義しているアセンブリはアクセスできます。

windows/vs/cs/library/core.txt · 最終更新: by プログレス合同会社