从程序集中获取信息而不加载它

时间:2013-03-12 17:38:46

标签: .net reflection .net-assembly

我的应用程序有一个插件结构,它将dll(bog标准.NET程序集)作为插件加载。我有一个应用程序范围选项,可以直接从磁盘加载这些dll(Assembly.LoadFrom(file)),或者先将dll复制到内存中,然后从字节数组加载Assembly.Load(IO.File.ReadAllBytes(file))

我想为插件开发人员添加选项,以选择是否要强制执行特定的加载行为。我以为我会使用AssemblyAttributes然后ReflectionOnly加载dll以查看属性是否已定义。但是我无法使用GetCustomAttributesData获取此信息,因为dll依赖于尚未反射加载的其他程序集。我现在发现自己正在进行一场卡尔卡式的游戏。

插件开发人员在他们的dll加载到真实之前与我的应用程序进行通信的好方法是什么? AssemblyAttributes是否可行,如果是这样,我如何确保反射加载永远不会失败?

编辑:

我引用了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

1 个答案:

答案 0 :(得分:1)

仅反射加载仍然会加载该东西,所以一旦你完成了这个,提出这个问题就太晚了。

一种选择是在单独的AppDomain中执行仅反射加载,然后将结果返回到主代码,并丢弃新的AppDomain。

使用属性的另一种方法是要求插件开发人员包含某种清单文件(例如文本或XML),其中包含您需要的任何信息或选项。