1

概要:

Mono 環境でアセンブリを手動で読み込もうとすると、Mac で BadImageFormatException が発生しますが、Windows では正常に動作します。Mono は別のアプリ内で実行されているため、ログを取得するためにデバッグを有効にしてコマンド ラインからアプリを実行することはできません。

詳細:

C# で Unity3D エディター用のプラグインをいくつか作成しました。彼らは、Mac と Windows の両方で 1 年以上働いています。クラスが別のディレクトリ(PATH変数にある)から初めて呼び出されたときにプラグインを手動でロードすることにより、Unityのデフォルトの「Plugins」ディレクトリからプラグインをロードする方法を変更しようとしています。Windows では、Assembly.LoadFile を呼び出すだけで、以前と同じようにすべて正常に動作します。Mac では、BadImageFormatException エラーが発生します。Mac ではプラグインがバンドルであるという事実に関連している可能性があると思いました。

私は試した:

Assmebly.LoadFile("MyPlugin")
Assmebly.LoadFile("MyPlugin.bundle")
Assmebly.LoadFile("MyPlugin.bundle/Contents/MacOS/MyPlugin")

最初のもの (ファイル名のみ) は、FileNotFoundException を返します。他の2つは BadImageFormatException を返し、それが見つかったと思いますが、何か他のことが間違っています。

何がうまくいかないのかについて、より多くの情報を得る方法はありますか? 例外の FusionLog メンバーは、Mac 上にあるため NULL です。基本的なメッセージしか表示されません。

このように手動でロードするには、プラグインを Mac で別の方法でビルドする必要がありますか?

ありがとう、ブレット

4

1 に答える 1

1

Assembly.LoadFile は、.NET アセンブリへのパスを受け取ります。

これはMyPlugin.bundle、ディレクトリであるため機能しないことを意味します。

最後のオプションについては、そのファイル (ディレクトリではなくファイルであると仮定) は .NET アセンブリである必要があります。そうであるかどうかを確認する 1 つの方法はfile、ターミナル ウィンドウからツールを実行することです。

$ file MyPlugin.bundle/Contents/MacOS/MyPlugin

次のように応答する必要があります。

MyPlugin: PE32 executable for MS Windows (DLL) (console) Intel 80386 32-bit Mono/.Net assembly

ただし、これは .NET アセンブリではなく、ネイティブ (OSX) バイナリであると思います (特に、.NET アセンブリには通常 .dll 拡張子が付いているため)。

于 2013-10-28T11:05:31.423 に答える