カテゴリー: プログラミング

Elem-ME開発でC# 7を使用します

Elem-MEなどの開発には、今までC#のVer.6を使ってきました。
しかし、C# Ver.7が使用できることが確認できたので、既存コードも移行することにしました。

よって、公開済みのコードに大きな変更が行われる可能性がありますのでご了承ください。
(Elem-MEに限らず、Team.E.L.E.M.E.N.Tで公開しているコード全てが対象です)
また、引数や戻り値の型が変わる可能性もありますので、もしコードを利用した場合は変更を確認するようお願いします。
なお、今すぐに全てのコードをアップグレードするのは不可能なので、少しずつの移行になります。


DXライブラリをC#でより使いやすく

DXライブラリをC#で利用することは公式でもサポートされてはいます。
しかし、利用方法はC#に最適化されていないため、C言語のように手続き型の呼び出し方をしなければいけません。
これではオブジェクト指向を活かせないので、より使いやすいように、オブジェクト指向を活用して利用できるようにするライブラリを作っています。
元々はElem-MEで利用するために作ったのですが、他のソフトウェアでも利用できるように、と公開します。

リポジトリを「https://github.com/TeamElement/DxLib」に公開していますので、もしDXライブラリをC#で利用する機会があれば利用してみてください。
実装した機能はまだ一部ですが、順次追加していく予定です。
実装を急いでほしい機能がある場合は、この投稿のコメントかGitHubのIssueに書き込んでください。(後者に書くことをおすすめします)

利用には、公式サイトからC#用DXライブラリを別途用意して頂く必要があります。
これは、DXライブラリが更新された場合に当ライブラリを更新しなくても変更なしで利用可能にするためです。


【.NET】アセンブリに関連付けてデータを暗号化するライブラリ

更新情報
2016/09/23 1.0.1を公開

.NETアプリケーションから利用できる暗号化ライブラリを作ってみました。
このライブラリの特徴は、暗号化に使う共通鍵に、ライブラリを呼び出したアセンブリの公開鍵を使うという点です。

アセンブリには電子署名を行うことで「厳密名」を持たせることができます。
その厳密名に含まれる公開鍵を使うことで、データを暗号化してもそれを復号できるのは同じアセンブリのみとなります。

厳密名を付けるには、署名に使う公開鍵と秘密鍵のペアが必要です。
そのうち、秘密鍵は開発者が厳重に管理しているはずですので、秘密鍵は開発者しか分かりません。
アセンブリを読み込む際、そのアセンブリが署名されている場合は付属している公開鍵を使って改ざんの有無を確認し、問題なければアセンブリが読み込まれます。
つまり、データを暗号化したアセンブリを改ざんして暗号化データを抽出しようとしても、秘密鍵を知らないため署名が出来ないので抽出は不可能ということになります。


【C#】リフレクションでの呼び出しを検出・禁止する方法

C#には「リフレクション」という便利な機能があります。
これは、メソッドなどを動的に呼び出したり、インスタンスを動的に生成したりすることができる機能です。

ただ、この機能、実はprivateに設定したメンバも呼び出してしまうことができます。
つまり、他から呼び出されると困るからprivateにしたメソッドがあったとしたら、それを利用者が意図的に呼び出すことが出来てしまう、という訳です。
まあ、利用者がprivateメンバまでクラス構造を理解していないとできませんが。
注意:フィールドおよび構造体の引数なしコンストラクタに対するアクセスを検出する方法はありません。


【C#】ファイルパスの正規化

C#でファイルパスの正規化を行おうと思ったのですが、絶対パスならSystem.IO.Path.GetFullName()で可能ですが相対パスについては上手く動作するコードがなかったので、こちらで作ったコードを公開しようと思います。

一応テスト済みですが、もし不具合があったら教えて頂けると助かります。


【C#】仮想メソッドとif分岐の速度比較

32bitと64bitのDllImport動的切り替えで、どうやって呼び出し先を選択するかと言えば、抽象メソッドと継承を使うかifで呼び分けるかの選択肢がありますが、今回、どちらが早いか実験してみたのでメモしておきます。

1.仮想メソッド方式
メソッドを定義した抽象クラスと、それを呼び出し先DLLごとに分けたサブクラスを作成し、プログラム初期化時に適切な方をnewしてそれを呼び出します。


【C#】System.Lazyクラスの弱参照版

System.Lazyクラスは、オブジェクトの生成に時間がかかる場合などに、必要になった時点で生成を行い、以後生成済みのオブジェクトを使うという機能をスレッドセーフで提供するものです。
今回はそれに弱参照を使って、生成後不要になったら一旦メモリから解放する機能を追加してみました。

ソースコードを以下に置いておきます。
これを使うにはWeakRef<T>クラスが必要なので、一緒に使ってください。
名前空間は変更して頂いて構いません。

https://www.myqnapcloud.com/smartshare/68704567o61n820u6428z5z3_6IiLTtA


弱参照の扱いを簡単にするクラスを作ってみた

C#で弱参照を扱うクラス「System.WeakReference」を使っていて、扱いにくいと思ったので、もっと扱いやすくなるよう独自にクラスを作ってみました。
使いたい方はご自由にお持ちください。
基本usingしなくても使えるよう名前空間がSystemになっていますが、気に入らない方はそれぞれ名前空間を変更してください。

http://www.myqnapcloud.com/smartshare/68704567o61n820u6428z5z3_6h1wEPX