0

クラス「Place」と整数を返す関数「Where」で構成される.NETDLLがあるとします。dllをアプリケーションドメインにロードし、関数を実行して、アプリケーションドメインをアンロードする必要があります。


Dim domain As AppDomain = AppDomain.CreateDomain("Executor")            
Dim buffer() As Byte = IO.File.ReadAllBytes("c:\path\Locator.dll")
Dim asy As Assembly = domain.Load(buffer)
Dim obj As [Object] = asy.CreateInstance("Locator.Place")
Dim method As MethodInfo = obj.GetType.GetMethod("Where")
Dim result as Integer = method.Invoke(obj, New [Object]() { 1 })
AppDomain.Unload(domain)

この行は失敗します:


Dim asy As Assembly = domain.Load(buffer)

このエラーメッセージの場合:


'Could not load file or assembly 'Place, Version=1.0.0.0, Culture=neutral, PublicKeyToken-null' or one of it's dependencies.  The System Cannot find the specified file.'

ファイルはバッファにあるので、依存関係の.dllだと思います。ただし、ベースプログラムディレクトリでそれらを見つける必要があります。

エラーの原因について何か考えはありますか?

アセンブリをAppDomainにロードし、関数を実行してから、AppDomainをアンロードするためのテスト済みのサンプルコードをいただければ幸いです。

(ところで、私はグーグルで検索しましたが、有用なサンプルは見つかりませんでした。)

4

2 に答える 2

1

エラーが参照の欠落によるものであると述べていることは正しいです。アセンブリの読み込み方法が原因で、参照を解決できない可能性があります。バイト配列からロードしているため、Assembly.Location は dll の場所を指しません。参照している dll は GAC にないため、参照されているアセンブリを見つけることができません。最初にバイト配列に読み込まずに、ファイルから直接アセンブリを読み込んでみてください。

于 2012-08-14T21:54:38.663 に答える
0

ロードできなかった依存関係を知りたい場合は、fuslogvwを使用してみてください。http://msdn.microsoft.com/en-us/library/e74a18c4(VS.71).aspxを確認してください

リンクテキストの説明はかなり良いと思いました。いくつかの落とし穴を示し、VB.NETに簡単に変換できるサンプルコードを提供します。

これがお役に立てば幸いです。

于 2009-02-05T19:46:43.863 に答える