从装配公开类

时间:2014-01-09 19:52:22

标签: .net vb.net reflection .net-assembly

我试图找到解决方案,但我失败了......

来自给定程序集的

我得到了包含它的所有“类名”。 这看起来很简单,但问题是当目标程序集有些引用未解析时。例如,当目标程序集不依赖于任何其他程序时,此代码可以正常工作:

Dim loAssembly As Reflection.Assembly = Reflection.Assembly.Load(loRawAssembly)
Dim loTypes As Type() = loAssembly.GetTypes()

For Each t As Type In loTypes
    If t.IsClass Then

      'do something with class names

    End If
Next t

如果我使用AppDomain.CurrentDomain.AssemblyResolve,解决所需的程序集然后工作,但永远不可能确定IT。 然后我想知道是否有另一种方法从一个给定的程序集中获取类名?

韩国社交协会

2 个答案:

答案 0 :(得分:0)

结帐Assembly.ReflectionOnlyLoad()。我不认为它需要加载引用的程序集。

来自MSDN Doc:

  

依赖项不会自动加载到仅反射中   上下文。

答案 1 :(得分:0)

寻求帮助。

我在这里找到了我的解决方案,使用Mono.Cecil:

Finding classes in a DLL that inherit from classes in an unavailable assembly

现在我的代码可以这样做:

Imports Mono.Cecil
Imports Mono.Cecil.Cil

Dim loMemStream As New IO.MemoryStream(pRawBytes)
Dim loListOfClass As New List(Of String)
Dim loAssDefininition As AssemblyDefinition = AssemblyDefinition.ReadAssembly(loMemStream)
Dim loTypes = loAssDefininition.MainModule.Types

 For Each elemento In loTypes
     If elemento.HasInterfaces Then
         For Each loInterface In elemento.Interfaces
            If UCase(loInterface.FullName) = UCase(pTargetInterface) Then
                 loListOfClass.Add(elemento.FullName)
            End If
         Next
    End If
 Next
 Return loListOfClass