Microsoft AccessのVBAやC#アプリケーションのNuGetで利用できるようにするため、ロジックとアダプターにプロジェクトを分離します。
ロジック部分をCoreプロジェクトとして作成します。
Visual Studio『新しいプロジェクトの作成(N)』でプロジェクトの作成を開始します。
テンプレートの選択C#、Windows、ライブラリでフィルターして、『.NETまたは.NET Standardを対象とするクラスライブラリ』を選択します。
『次へ(N)』で次に進みます。
プロジェクトの構成プロジェクト名はCore、ソリューション名はライブラリ名にしています。
ソリューションは複数のプロジェクトで構成しますので、『ソリューションとプロジェクトを同じディレクトリに配置する(D)』のチェックボックスは必ず外します。
『次へ(N)』で次に進みます。
フレームワークの選択
Coreプロジェクトでは、最新のフレームワークを選択して構いません。
プロジェクト作成後に.NET Frameworkでも参照できるように設定します。
『作成(C)』でプロジェクトが作成されます。
自動で生成されるClass1.csを削除します。
作成するライブラリは、パソコン内のすべてのアプリケーションから参照させる必要がないため、GAC(Global Assembly Cache)に配置させず、RegAsmを使用してレジストリに配置先ディレクトリを登録するようにします。
レジストリ登録時の警告を回避するため、署名用のファイルを作成します。
※警告を無視してもいい場合は署名用ファイルを作成する必要はありません。
Visual Studioのツールバーから『ツール(T)』➡『コマンドライン(L)』➡『開発者用PowerShell(P)』で開発者用PowerShellを起動します。
sn -k OAuthLib.snk
全プロジェクトで共有する定義を作成します。
ソリューションエクスプローラー『ソリューション』➡『追加(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>
下記のいずれかの方法で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>
Coreプロジェクトの最終出力アセンブリは、上位のComやNuGetプロジェクトで参照するパッケージとの競合を避けるため、プロジェクトで参照しているパッケージをすべて一つにまとめたものにします。
一つにまとめるためILRepackをインストールします。
ソリューションエクスプローラー『Core』を右クリック➡『NuGetパッケージの管理(N)…』でNuGetパッケージマネージャーを開きます。
NuGetパッケージマネージャー『nuget.org』の『参照』タブでILRepack.Lib.MSBuild.Taskを選択します。
ILRepack.Lib.MSBuild.Task『インストール』をクリックします。
変更のプレビューインストールするパッケージを確認して『適用』をクリックします。
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>
:
インターフェース定義を作成します。
インターフェース定義と実装クラスは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();
}
}
クラスの実装を作成します。
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()
{
}
}
}