3

私のアプリにはプラグイン構造があり、プラグインとしてdll(bog標準の.NETアセンブリ)をロードします。Assembly.LoadFrom(file)これらのdllをディスクから直接ロードする( )か、最初にdllをメモリにコピーしてからバイト配列からロードする()というアプリケーション全体のオプションがありますAssembly.Load(IO.File.ReadAllBytes(file))

プラグイン開発者が特定の読み込み動作を強制するかどうかを選択するためのオプションを追加したいと思います。これにはAssemblyAttributesを使用してから、ReflectionOnlyがdllをロードして、属性が定義されているかどうかを確認すると思いました。ただし、dllはリフレクションのみがロードされていない他のアセンブリに依存しているため、GetCustomAttributesDataを使用してこの情報を取得することはできませんでした。私は今、モグラたたきのカフカエスクゲームに参加しています。

プラグイン開発者が、dllが実際に読み込まれる前に、私のアプリと通信するための良い方法は何でしょうか?AssemblyAttributesは進むべき道ですか?もしそうなら、reflectiononlyの読み込みが失敗しないようにするにはどうすればよいですか?

編集:

アセンブリ属性を反復処理するためにMono.Cecilを参照しました。初めてセシルを使用したのですが、正しく使用していることを願っています。私の開発者マシンでの初期テストは機能しているようです。

Private Function ExtractAssemblyLoadBehaviour(ByVal file As String) As GH_LoadingBehaviour
  Try
    If (Not IO.File.Exists(file)) Then Return GH_LoadingBehaviour.ApplicationDefault

    Dim assembly As AssemblyDefinition = AssemblyDefinition.ReadAssembly(file)
    If (assembly Is Nothing) Then Return GH_LoadingBehaviour.ApplicationDefault

    Dim attributes As Collection(Of CustomAttribute) = assembly.CustomAttributes
    If (attributes Is Nothing) Then Return GH_LoadingBehaviour.ApplicationDefault
    For Each Attribute As CustomAttribute In attributes
      Dim type As TypeReference = Attribute.AttributeType
      If (type.FullName.Contains("GH_CoffLoadingAttribute")) Then Return GH_LoadingBehaviour.ForceCOFF
      If (type.FullName.Contains("GH_DirectLoadingAttribute")) Then Return GH_LoadingBehaviour.ForceDirect
    Next

    Return GH_LoadingBehaviour.ApplicationDefault
  Catch ex As Exception
    Return GH_LoadingBehaviour.ApplicationDefault
  End Try
End Function
4

1 に答える 1

1

リフレクションのみのロードはまだ物をロードするので、一度それを行ったら、質問をするのは遅すぎます。

1つのオプションは、別のAppDomainでリフレクションのみのロードを実行してから、結果をメインコードに戻し、新しいAppDomainを破棄することです。

属性を使用する代わりに、プラグイン開発者に、必要な情報やオプションを含むある種のマニフェストファイル(テキストやXMLなど)を含めるように依頼することもできます。

于 2013-03-14T21:08:00.593 に答える