我的应用程序有一个插件结构,它加载dll (bog标准。net程序集)作为插件。我有一个应用程序范围的选项,要么直接从磁盘(Assembly.LoadFrom(file)
)加载这些dll,要么先将dll复制到内存中,然后从字节数组(Assembly.Load(IO.File.ReadAllBytes(file))
)加载。
我想为插件开发人员添加一个选项,让他们选择是否要强制特定的加载行为。我想我会为此使用AssemblyAttributes,然后ReflectionOnly加载dll以查看是否定义了属性。但是,我无法使用GetCustomAttributesData获得此信息,因为dll依赖于尚未仅加载反射的其他程序集。我现在发现自己在玩卡夫卡式的打地鼠游戏。
插件开发人员在真正加载dll之前与我的应用程序进行通信的好方法是什么?AssemblyAttributes是正确的方法吗?如果是,我如何确保仅反射加载永远不会失败?
编辑:我引用了Mono。以遍历程序集属性。我第一次利用塞西尔,希望我没做错。在我的开发机器上进行初步测试似乎有效。
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
Reflection-only load仍然会加载这个东西,所以一旦你完成了,再问这个问题就太晚了。
一种选择是在单独的AppDomain中执行仅反射加载,然后将结果返回给主代码,并丢弃新的AppDomain。
使用属性的另一种选择是要求插件开发人员包含某种类型的清单文件(例如文本或XML),其中包含您需要的任何信息或选项