2012-02-03 4 views
0

Я подключаю свою программу к внешнему коду. Я настраиваю его так, чтобы внешний код мог создавать объекты экземпляра, и я столкнулся с проблемой. Я создал эту функцию здесь:Верните объект, связанный с именем

Public Function InstanceOf(ByVal typename As String) As Object 
    Dim theType As Type = Type.GetType(typename) 
    If theType IsNot Nothing Then 
     Return Activator.CreateInstance(theType) 
    End If 
    Return Nothing 
End Function 

Я пытаюсь создать System.Diagnostics.Process объект. Однако для какой бы то ни было причины он всегда возвращает Nothing вместо объекта. Кто-нибудь знает, что я делаю неправильно?

Я делаю это в VB.NET, так что все .net ответы принимаются :)

ответ

1

Читайте внимательно через the documentation of Type.GetType(), в частности, эта часть:

Если TYPENAME включает пространство имен, но а не имя сборки, этот метод выполняет поиск только сборки вызывающего объекта и Mscorlib.dll в этом порядке. Если typeName полностью соответствует частичному или полному имени сборки, этот метод выполняет поиск в указанной сборке. Если сборка имеет сильное имя, требуется полное имя сборки.

С System.Diagnostics.Process в системе System.dll (не Mscorlib.dll) необходимо использовать полное имя. Предполагая, что вы используете .NET 4.0, который был бы:

System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 

Если вы не хотите работать с полностью квалифицированными именами, вы можете пройти через все нагруженные узлы и попытаться получить тип с помощью Assembly.GetType().

+0

Как я могу определить полное имя для всего? (т. е. как вы пришли к этому имени?) – FreeSnow

+1

Если вы можете получить доступ к типу, то что-то вроде 'typeof (Process) .AssemblyQualifiedName' вернет его. – svick

1

вы можете использовать что-то вроде этого для создания своих объектов.

Я определил локальный класс, а также использовал ваш пример процесса.

Public Class Entry 
    Public Shared Sub Main() 
     Dim theName As String 
     Dim t As Type = GetType(AppleTree) 
     theName = t.FullName 
     Setup.InstanceOf(theName) 

     t = GetType(Process) 

     theName = t.FullName & ", " & GetType(Process).Assembly.FullName 


     Setup.InstanceOf(theName) 

    End Sub 
End Class 


Public Class Setup 
    Shared function InstanceOf(typename As String) as object 
     Debug.Print(typename) 
     Dim theType As Type = Type.GetType(typename) 
     If theType IsNot Nothing Then 
      Dim o As Object = Activator.CreateInstance(theType) 
      ' 
      Debug.Print(o.GetType.ToString) 
      return o 
     End If 
     return nothing 
    End function 
End Class 

Public Class AppleTree 
    Public Sub New() 
     Debug.Print("Apple Tree Created") 
    End Sub 
End Class 
Смежные вопросы