0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ソースコードが無い .NET DLL を AI Agentから呼び出せる形にした話

0
Last updated at Posted at 2026-04-20

ソースコードが無い .NET DLL を AI から呼び出せる形にした話

はじめに

前回の記事では、既存の .NET デスクトップアプリのソースコードを仕様書として扱い、AI から呼び出せる Agent / Skill に再構成する方法を紹介しました。

今回はその続編として、ソースが手元に無く DLL しか残っていない場合 にどう対処したかをまとめます。

現場でよくあるのは、こういうケースです。

  • 外部ベンダー提供の DLL で、ソースが開示されていない
  • 古いサブシステムでソース一式が紛失している
  • ビルド環境が失われ、再コンパイルできない

動いてはいるのに中身を追えない DLL が、現役で使われ続けているという状況です。


方針:DLL を逆コンパイルして仕様書代わりにする

ソースが無いのなら、DLL 自体を仕様書にしてしまうというのが今回の発想です。

使ったのは OSS の ilspycmd。DLL から C# コードを復元できる CLI ツールで、メソッドのシグネチャだけでなく、内部の SQL 文やバリデーションロジックまで読み取れます

前回の「ソースが AI の仕様書になる」を一段広げて、

逆コンパイル結果が AI の仕様書になる

という方針で進めました。


生成ユーティリティの位置づけ

前回紹介したユーティリティ Skill 群に、今回 DLL 専用の生成 Skill を追加しました。

Skill 入力 役割
function-skill-creator ソースコード Skill を生成
dll-skill-generator(新規) DLL バイナリ 逆コンパイル経由で Skill を生成

使い分けはシンプルです。

  • ソースがある → function-skill-creator
  • DLL しか無い → dll-skill-generator

成果物(SKILL.md + run.py)は両者とも同じ形式なので、ソースの有無を意識せずに Skill を扱えるのがポイントでした。


生成フロー

処理はおおまかに次の流れです。

DLL
  ↓ クラス一覧の取得
  ↓ 対象クラスをフィルタ(DataAccess / Service / DAL 等)
  ↓ クラス単位で C# に逆コンパイル
  ↓ メソッドのシグネチャ・内部ロジックを抽出
  ↓ テンプレートに流し込んで run.py を生成
  ↓ SKILL.md に逆コンパイル由来情報を付与
Skill 成果物

肝になるのは、クラスとメソッドのフィルタです。

DLL の中身を全部 Skill 化してしまうと、UI コードや内部ヘルパーまで候補に入って、AI が何を呼ぶべきか迷います。そこで、

  • 対象にするのは 業務ロジックを持つクラス(DataAccess / Service / DAL 系)
  • 対象にするのは public メソッド のみ(非同期ペアやプロパティは除外)
  • デフォルトでは 取得系(Select / Get 系)のみ生成 し、更新系は明示指定が必要

というルールを置き、AI に見せる Skill の粒度を揃えるようにしました。


逆コンパイルからどこまで読めるか

シグネチャだけでなく、メソッドの中身も読めるのがこのアプローチの強みです。

  • 埋め込まれた SQL 文 → どのテーブルを見ている Skill か分かる
  • if (string.IsNullOrEmpty(...)) → 必須パラメータが特定できる
  • dt.Columns.Add(...) → 戻り値のカラム一覧が推定できる

これらを SKILL.md の「内部動作」セクションに転記しておくと、AI が Skill を選ぶときの判断材料になります。

難読化されていない社内 DLL であれば、業務判断に必要な情報はほぼ拾えました。


生成される SKILL.md のイメージ

成果物には、逆コンパイル由来であることを明示しておきます。

## 対応する元コード
- 元言語: C#(ilspycmd で逆コンパイル)
- 元クラス: Sample.Namespace.SampleService
- 元メソッド: GetSampleInfo(...)
- DLL: SampleService.dll

将来ベンダーから正式なソースが提供されたときに、どの Skill を作り直すべきかを判定する目印にもなります。逆コンパイル由来の Skill は、あくまでソースが戻るまでのブリッジという位置づけです。


実行イメージ

DLL のパスと親 Agent を指定するだけで、中のクラス・メソッドを一括で Skill 化します。

生成完了: SampleService.dll
- 対象クラス: 2個
- 生成Skill: 5個(取得系のみ)
- 除外メソッド: 8個

DLL を放り込むだけで、その業務の取得系 API が自然言語から呼べる状態になるのが狙いです。


メリット

  • ソース無しでも既存資産を活用できる
  • function-skill-creator と成果物が揃う(後からソース版に差し替え可能)
  • 更新系を安全側に倒せる(デフォルトは取得系のみ)
  • 内部ロジックまで拾える(SQL・必須パラメータ・戻り値カラム)

注意点

難読化 DLL は対象外
クラス名・メソッド名が潰されていると、逆コンパイルできても意味が読み取れません。

取得系と更新系の線引き
業務インパクトが読み切れないため、デフォルトは取得系のみ。更新系を公開する場合は、認証・権限管理・確認プロンプトを必ず前段に置きます。


まとめ

  • 前回:既存ソースを仕様書として Skill 化(function-skill-creator
  • 今回:既存 DLL を逆コンパイルして Skill 化(dll-skill-generator

この 2 本立てで、ソースの有無に関わらず既存資産を AI の入り口につなげることができるようになりました。

長年運用されてソースが追いにくくなった DLL を抱える現場ほど、全面再構築に踏み込まずに AI 連携へ進められる選択肢として有効だと感じています。


関連

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?