私のアプリにはプラグイン構造があり、プラグインとして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