【c#】ライセンス認証機能を実装する方法

C#
アプリをリリースしたい人
アプリをリリースしたい人

C#.NETでアプリを作ってリリースしたいけど、ライセンス認証機能ってどうやって作るんだろう。

本記事はこういった方向けに、一例ではありますがライセンス認証機能を実装する方法をご紹介します。

※注意

  • ユーザーに固定のライセンスキーを配布する運用向けです。
    (ユーザーごとに異なるライセンスを配布する運用には向いていないかと思います。)
  • Visual Studioの”Windows フォーム アプリケーション(.NET Framework)”で開発する方を想定しています。

紹介する方法の具体的な仕様

本記事では下記のような仕様でライセンス認証機能を実装する方法を紹介します。

処理1
ユーザーがアプリケーションを開く。

処理2
処理1で開いたアプリケーションと同じ階層のディレクトリに”License.txt”という名前のファイルがあるか確認する。

処理3
処理2の結果によって、それぞれ下記の処理を行う。

ケースA

”License.txt”という名前のファイルがない。
または ”License.txt”という名前のファイルはあるが ”License.txt”の1行目の内容がライセンスキーと一致しない。

①ライセンス画面を表示する。

②ライセンスキーと一致する値を入力してOKを押すと下記を行う。

  • アプリケーションの続きの操作が行えるようになる。
  • 処理1で開いたアプリケーションと同じディレクトリに”License.txt”を生成する。
  • License.txt”の1行目には、ライセンスキーが入力される。
開発者が設定したライセンスキーと一致する値を入力してOKを押す
アプリケーションの続きの操作が行える
処理1で開いたアプリケーションと同じ階層のディレクトリに”License.txt”が作られる。
”License.txt”の1行目にはライセンスキーが記載される。

(補足)
開発者が設定したライセンスキーと一致しない値を入力してOKを押すとエラーメッセージを表示する。
OKボタンを押すと再びライセンス認証画面に戻る。

また、キャンセルボタンをクリックするとアプリケーションを終了する。

ケースB

”License.txt”という名前のファイルがあり、”License.txt”の1行目の内容がライセンスキーと一致する。

この場合にはライセンス画面は表示せず、アプリケーションを操作できる。

実装手順

ここからは、紹介する方法の具体的な仕様項で紹介したライセンス認証機能を実装する方法を解説します。

ライセンス認証画面を作成する

1 Windowsフォームアプリケーションとしてライセンス認証画面を作成します。新規プロジェクト作成画面で名前を”LicenceForm”として[OK]をクリックしてください。

2 以下のようにライセンスフォームをデザインしてください。

それぞれのコントロールのプロパティは下記のように設定してください。
Location、size、textプロパティは適宜の指定でOKです。

■フォーム

プロパティ 設定する値
ControlBox false
MaximizeBox false
(Name) license
FormBorderStyle FixedSingle
StartPosition CenterScreen

■テキストボックス

プロパティ 設定する値
(Name) txtLicencekey
TabIndex 1

■OKボタン

プロパティ 設定する値
(Name) btnOK
TabIndex 2

■キャンセルボタン

プロパティ 設定する値
(Name) btnCancel
TabIndex 3

3.Form1.csに下記のように記述してSystem.IO名前空間をインポートします。

using System.IO;

4.フォーム(licenseクラス) のコンストラクタの直下に下記コードを記述します。

参考: ↓フォーム(licenseクラス) のコンストラクタ

public license()
{
    InitializeComponent();
}

↓記述するコード

private string _licenseKey = string.Empty;
private string _licenseFile = string.Empty;
internal static Boolean _isNormal = false; //LicenseForm.exeを直接起動したかどうか
/// <summary>
/// ライセンスキーを設定します。
/// </summary>
public string licenseKey
{
    set { this._licenseKey = value; }
}
/// <summary>
/// ライセンスキーが記載されているファイルを設定します。
/// </summary>
public string licenseFile
{
    set { this._licenseFile = value; }
}
/// <summary>
/// LicenseForm.exeを直接起動したかどうかを設定します。
/// </summary>
public Boolean isNormal
{
    set { _isNormal = value; }
    get { return _isNormal; }
}
/// <summary>
/// ライセンスのチェックを行います。
/// </summary>
/// <returns></returns>
public Boolean LicenseCheck()
{
    Boolean Islicence = false;
    if (System.IO.File.Exists(_licenseFile))
    {
        StreamReader sr = new StreamReader(_licenseFile, Encoding.GetEncoding("Shift_JIS"));
        string rl = sr.ReadLine();
        if (_licenseKey == rl)
        {
            Islicence = true;
        }
        sr.Close();
    }
    return Islicence;
}

5.OKボタンのクリックイベントを生成し、処理内容を下記のようにします。

//あらかじめ指定されているライセンスキーと一致するようならば、ファイルの上書き処理を行う。
if (txtLicencekey.Text != _licenseKey)
{
    MessageBox.Show("ライセンスキーが不正です。","エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
    return;
}
StreamWriter writer = new StreamWriter(_licenseFile, false, Encoding.GetEncoding("Shift_JIS"));
writer.WriteLine(txtLicencekey.Text);
writer.Close();
this.DialogResult = DialogResult.OK;
this.Close();

6.キャンセルボタンのクリックイベントを生成し、処理を下記のようにします。

this.DialogResult = DialogResult.Cancel;
this.Close();

7.ソリューションエクスプローラーから、”Program.cs”を開きます。

8.”Application.SetCompatibleTextRenderingDefault(false);”と”Application.Run(new license());”の間に下記のコードを入力します。

//LicenseForm.exeを直接起動した場合は終了する。
if (LicenceForm.license._isNormal == false)
{
    MessageBox.Show("このファイルは直接起動して使用するファイルではありません。", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
    return;
}

以上でライセンス認証画面を作成手順は終わりですが、ここまでの内容をまとめるとForm1.cs、Program.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;
using System.IO;
namespace LicenceForm
{
    public partial class license : Form
    {
        public license()
        {
            InitializeComponent();
        }
        private string _licenseKey = string.Empty;
        private string _licenseFile = string.Empty;
        internal static Boolean _isNormal = false; //LicenseForm.exeを直接起動したかどうか
        /// <summary>
        /// ライセンスキーを設定します。
        /// </summary>
        public string licenseKey
        {
            set { this._licenseKey = value; }
        }
        /// <summary>
        /// ライセンスキーが記載されているファイルを設定します。
        /// </summary>
        public string licenseFile
        {
            set { this._licenseFile = value; }
        }
        /// <summary>
        /// LicenseForm.exeを直接起動したかどうかを設定します。
        /// </summary>
        public Boolean isNormal
        {
            set { _isNormal = value; }
            get { return _isNormal; }
        }
        /// <summary>
        /// ライセンスのチェックを行います。
        /// </summary>
        /// <returns></returns>
        public Boolean LicenseCheck()
        {
            Boolean Islicence = false;
            if (System.IO.File.Exists(_licenseFile))
            {
                StreamReader sr = new StreamReader(_licenseFile, Encoding.GetEncoding("Shift_JIS"));
                string rl = sr.ReadLine();
                if (_licenseKey == rl)
                {
                    Islicence = true;
                }
                sr.Close();
            }
            return Islicence;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            //あらかじめ指定されているライセンスキーと一致するようならば、ファイルの上書き処理を行う。
            if (txtLicencekey.Text != _licenseKey)
            {
                MessageBox.Show("ライセンスキーが不正です。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            StreamWriter writer = new StreamWriter(_licenseFile, false, Encoding.GetEncoding("Shift_JIS"));
            writer.WriteLine(txtLicencekey.Text);
            writer.Close();
            this.DialogResult = DialogResult.OK;
            this.Close();
        }
        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.Cancel;
            this.Close();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace LicenceForm
{
    static class Program
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            //LicenseForm.exeを直接起動した場合は終了する。
            if (LicenceForm.license._isNormal == false)
            {
                MessageBox.Show("このファイルは直接起動して使用するファイルではありません。", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            Application.Run(new license());
        }
    }
}

アプリケーションにライセンス認証画面を実装する

1.ライセンスフォーム画面を実装したいアプリを起動します。

2. [File(F)]-> [追加(D)] -> [既存のプロジェクト(E)…] をクリックします。

3.ライセンス認証画面を作成する項で作成したライセンスフォーム画面のプロジェクトファイルを選択し[開く(O)]をクリックします。

(補足)
そうするとソリューションエクスプローラーに追加したプロジェクトが反映されます。

4.ソリューションエクスプローラーから、ライセンスフォーム画面を実装したいアプリの”参照”を右クリックして[参照の追加…]をクリックします。

5.プロジェクトに、3で追加したプロジェクトが表示されているかと思うので、それを選択して[OK]をクリックします。

6.ライセンスフォーム画面を実装したいアプリの、Program.csをクリックします。

7.”Application.SetCompatibleTextRenderingDefault(false);”と”Application.Run(new license());”の間に下記のコードを入力します。
ここで、LicenceForm.licenseKeyの値に、ライセンス認証を承認するライセンスキーを入力してください。下記の例だと”abc”となります。

///ライセンスキーのチェックを行う
LicenceForm.license LicenceForm = new LicenceForm.license();
LicenceForm.isNormal = true;
LicenceForm.licenseKey = "abc";
LicenceForm.licenseFile = System.IO.Directory.GetCurrentDirectory() + @"\License.txt";
if (LicenceForm.LicenseCheck() == false)
{
    LicenceForm.ShowDialog();
    if (LicenceForm.DialogResult == DialogResult.Cancel)
    {
        return;
    }
}

以上でアプリケーションにライセンス認証画面を実装する項の手順は終わりですが、内容をまとめるとProgram.csのコードは下記のようになっているかと思います。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Sample
{
    static class Program
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            ///ライセンスキーのチェックを行う
            LicenceForm.license LicenceForm = new LicenceForm.license();
            LicenceForm.isNormal = true;
            LicenceForm.licenseKey = "abc";
            LicenceForm.licenseFile = System.IO.Directory.GetCurrentDirectory() + @"\License.txt";
            if (LicenceForm.LicenseCheck() == false)
            {
                LicenceForm.ShowDialog();
                if (LicenceForm.DialogResult == DialogResult.Cancel)
                {
                    return;
                }
            }
            Application.Run(new Form1());
        }
    }
}

以上となります。
これで、紹介する方法の具体的な仕様項で紹介したような仕様のアプリケーションが出来上がっているかと思います。
参考になれば幸いです。

タイトルとURLをコピーしました