1

アプリケーションで実行時にアセンブリをロードしています。

FileStream lDLLStream = lDLLPath.OpenRead();
byte[] lDLLArray = new byte[lDLLStream.Length];
lDLLStream.Read(lDLLArray, 0, (int)lDLLStream.Length);

Assembly lAssembly = Assembly.Load(lDLLArray);

ただし、次の例外が発生します。

Could not load file or assembly 'UnityEngine, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.

ただし、最初にロードしようとしていた DLL (および UnityEngine にも依存しているため、当然のことながら) の両方を参照する同じディレクトリから別の DLL をロードすると、エラー メッセージは表示されません。

実際、読み込み時に、2 番目の (動作中の) DLL が参照アセンブリに正確に含まれていることがわかります。

UnityEngine, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null

したがって、2 番目の DLL をロードできるかどうか、最初の DLL のロードに失敗する原因は何かを確認できていません。

追加情報: 最初の (動作していない) DLL は、Unity (3D ゲーム エンジン) によって生成された DLL であり、2 番目の DLL は Unity ソリューションで作成したプロジェクトです。

私のプロジェクトは .NET 4.0 (Unity は 3.5) ですが、テスト DLL を 3.5 にコンパイルするように設定しようとしましたが、ロード時にクラッシュしませんでした。

Unity Answers で尋ねたほうがよいかどうかわかりません。

更新: OK、思ったほど奇妙ではないかもしれません。2 番目の動作中の DLL は、ロードに失敗していた DLL を使用していなかったため、動作していただけで、失敗することはありませんでした。また、Unity DLL を実行中のディレクトリにダンプすることで最初の DLL をロードできるので、必要な場所にディレクトリを追加する方法を見つける必要があると思います。

更新 2: だから私は聞いてこの問題を「修正」しました

AppDomain.CurrentDomain.AssemblyResolve

また、例外を修正した欠落している DLL を見つけるためのダイアログ ボックスをユーザーに表示します。これを行うためのより良い方法があるかどうかを知っていただければ幸いです。ユーザーはカスタム DLL を指定しているため、おそらくこれが唯一の合理的な方法です。それ以外の場合は、これを回答として投稿します。

4

1 に答える 1

0

基本的に、私の問題は、(一種の)微妙な問題の中に隠された単純なものでした。問題は、DLL を探す場所がわからなかったことです。私は、DLL が既に 1 回読み込まれていると思っていたので、混乱しました。実際、DLL は使用されていないためロードされず、動作中の DLL が失敗することはありませんでした。

人々がこれを見つけた場合、私のアドバイスは、動作中の DLL が問題のある DLL を何かを使用して実際にロードしていることを確認することだと思います。

于 2013-10-22T11:35:16.923 に答える