Unity のMCP(モデルコンテキストプロトコル)ツールを使ってC#コードを実行する際に、こんなエラーが出ることがあります。
Error running mono.exe: ファイル名または拡張子が長すぎます。
なぜこのエラーが起きるのか
UnityのMCPツールは、通常「CodeDom」という仕組みでC#をコンパイルします。このCodeDomは、コードをコンパイルする際にWindows上でmono.exeというプログラムを起動しますが、その時に使用するアセンブリ(DLL)のパス情報をコマンドラインで渡します。
Unityプロジェクトが多くのパッケージを使っていると、これらのパス情報が合計で長くなりすぎて、Windows が許可している文字数の制限(260文字)を超えてしまい、エラーになるのです。
解決策:Roslyn を使う
CodeDom の代わりに「Roslyn」(マイクロソフトの公式なC#コンパイラ)をメモリ内で直接動かすことで、この問題を回避できます。幸いなことに、Unityには既にRoslynが組み込まれているので、それを有効化するだけです。
実装方法
以下のコードを Assets/Editor/RoslynLoader.cs として保存してください。
[InitializeOnLoad]
static class RoslynLoader
{
static RoslynLoader()
{
var editorData = Path.GetDirectoryName(UnityEditor.EditorApplication.applicationPath);
var roslynDir = Path.Combine(editorData, "Data", "MonoBleedingEdge", "lib",
"mono", "msbuild", "Current", "bin", "Roslyn");
var dlls = new[]
{
"System.Collections.Immutable.dll",
"Microsoft.CodeAnalysis.dll",
"Microsoft.CodeAnalysis.CSharp.dll",
};
foreach (var dll in dlls)
if (File.Exists(Path.Combine(roslynDir, dll)))
Assembly.LoadFrom(Path.Combine(roslynDir, dll));
}
}
このコードはUnityの起動時に自動実行され、RoslynのDLLファイルをメモリにロードします。[InitializeOnLoad]属性により、Unityが起動するたびに自動的に実行されます。
確認方法
実装後、MCPツールで以下のコードを実行してみてください。
return System.Type.GetType(
"Microsoft.CodeAnalysis.CSharp.CSharpSyntaxTree, Microsoft.CodeAnalysis.CSharp"
) != null ? "Roslyn有効" : "未ロード";
「Roslyn有効」と表示されれば成功です。これで長いファイルパスの問題が解消され、エラーなくコードが実行できるようになります。
