「.dll」と「.manifest」 is 何?

PluginsとLibs

Beat SaberのMod入れてますかー?

Modを入れるとき、ModAssistantで80割くらいは解決するのでModがどのファイルなのかを意識することはほとんどないでしょう。

とはいっても、ModAssistantに登録されてないModの大半はDLLをPluginsフォルダに突っ込んで終わりです。

では実際にPluginsフォルダの中を覗いてみましょう。

画像1

だれやおまえら。

なにやらDLLの中に混じる.manifestなるファイル軍がちらほら見えますね。
このManifest(マニフェスト)ファイル達は何のためにいるんでしょうね~。

その謎を解明すべく我々はジャングルの奥地(Libsフォルダ)へと向かった。

画像2

というわけでこちらがLibsフォルダです。なにやらここにもDLLファイルがいっぱいありますね。
そしてよく見るとManifestファイルと同じ名前のDLLがちらほら。

もったいぶっても仕方ないのでManifestファイルの存在を説明すると「LibsにこのDLLがあるよ!」ってことを教えてくれるファイルなのです。

その情報があると何がうれしいの?って話なのですがLibsにあるDLLは「ライブラリ」と呼ばれるもので、Modと違い単体ではBeatSaberに何の影響も与えないファイル達なのです。

PluginsにあるDLLもライブラリだって?
君のような勘のいいガキは嫌いだよ。

ここからは、便宜上PluginsにあるDLLを「Mod」、LibsにあるDLLを「ライブラリ」と呼びます。

Manifestファイル

先にマニフェストの中身を見て見ましょう。

{
 "$schema": "https://raw.githubusercontent.com/beat-saber-modding-group/BSIPA-MetadataFileSchema/master/Schema.json",
 "author": "lolPants",
 "description": "Official C# Library to interact with the BeatSaver API",
 "gameVersion": "1.13.2",
 "id": "BeatSaverSharp",
 "name": "BeatSaverSharp",
 "version": "2.0.1",
 "features": [],
 "dependsOn": {},
 "links": {
   "project-home": "https://github.com/lolPants/BeatSaverSharp",
   "project-source": "https://github.com/lolPants/BeatSaverSharp/tree/master/BeatSaverSharp",
   "donate": "https://www.paypal.me/jackbarondev"
 },
 "files": [
   "Libs/BeatSaverSharp.dll"
 ]
}

JSONじゃねーか。

はい、JSONです。
各項目を説明してもModder以外意味ないので重要な2か所だけ説明します。

・version:ライブラリのバージョンを表します。
・files:このマニフェストとペアになるファイル(ここではライブラリ)を表します。

なるほどね。


それでおばあちゃんのLibsにあるライブラリはBeatSaberに何の影響も与えないんでしょ?
どうしてこんなファイルがあるの?

それはね赤ずきん、PluginsにあるModたちが使うんじゃよ。

依存Modとマニフェスト

使うってなんだよ。
PluginsにあるModはDLL突っ込んだら動くんじゃないのかよ。

普通に説明するとややこしいので、ここではハイジャックを行うテロリストで例えて説明していきます。

・テロリスト集団のボス→IPA
・テロリスト達→Mod
・銃→ライブラリ
・銃の場所→Manifestファイル

イメージとしてはこんな感じです。

テロリスト君はハイジャックを行うことができるModです。
テロリスト君の計画ではハイジャックに銃を使います。
ボスはテロを行うためテロリスト君たちを呼び寄せます。

ここでテロリスト君はボスに尋ねます。

テロリスト君「おっしゃ!テロするから銃くれや!」

ここで銃の場所の情報(Manifestファイル)がないとどうなるでしょうか?

ボス「銃?無いよ」

テロリスト君「は?じゃテロしねーわ」

と、なってテロリスト君は事件現場に行くことはないんですね。

ここでのテロリスト君と銃の関係が依存Modと呼ばれる関係ですね。
この場合「テロリスト君が銃に依存している」となるわけです。

つまりManifestファイルは「Modの依存関係を解決するためのファイル」ともいえるわけです。
というかMod製作者はこちらの意味で使います。

え、でも依存ModってPluginsの中にあるものが前提になってるModもあるよ?

君、勘よすぎでは?

実はPluginsにあるDLLにはManifestファイルが埋め込まれているのです。
どういうことって?文字通り埋め込まれているのです。

GitHubで公開されているModのソースコードを見て見ましょう。

画像3

manifest.jsonあるじゃん。

中を覗くと…

{
 "$schema": "https://raw.githubusercontent.com/bsmg/BSIPA-MetadataFileSchema/master/Schema.json",
 "id": "UltimateFireworks",
 "name": "UltimateFireworks",
 "author": "denpadokei",
 "version": "0.2.2",
 "description": "",
 "gameVersion": "1.16.1",
 "dependsOn": {
   "BSIPA": "^4.1.3",
   "BeatSaberMarkupLanguage": "^1.4.1",
   "SiraUtil": "^2.5.1"
 },
 "features": []
}

さっき見た。

ここで重要なのはdependsOnです。
このdependsOnにはそのModが使用するライブラリや他のModが記載されています。
テロリスト君が使う銃の種類ですね。

ここに書かれているModが無い場合は読み込まれません。
読み込まないということは「必要なModがなくてバグった!」なんてことが起きないんですね!
かしこい!

逆に言うとここに依存Modを書き忘れた場合場合必要なModが読み込まれようが読みこれてなかろうがIPAが呼び出しちゃうわけですね。

ボス「お?こいつ銃いらんやんけ。よんだろ。」
飛行機に乗り込んだ本当は銃が欲しいテロリスト君「銃ないやん」

ハイジャック失敗!!
かなしい。

最後に

長々と書きましたが使うユーザーが注意するべき点は2つ

・LibsにDLLを入れたらついになるManifestファイルをPluginsに突っ込むこと
・Pluginsにマニフェストを入れたらついになるLibsにDLLを突っ込むこと

いや、同じことやんけ。

ってツッコミが出てきたらこの記事を完璧に理解した証拠です。

Twitterで「Manifestファイル完全に理解した」とつぶやく権利が得られます。
やったね!