Assembly zur Laufzeit laden

18/09/2008 - 11:39 von Stefan Simon | Report spam
Hallo,

ich habe eine Klasse "ClassLibrary1", die enthàlt folgenden Code.

\\\
Public Class Class1
Public Function F1() As Integer
Return 1 + 1
End Function
End Class
///

Und ich habe eine ConsoleApplication mit einem Verweis auf die ClassLibrary1
(wegen der Typsicherheit wàhrend der Entwicklungszeit) mit folgendem Code.

\\\
Imports System.Reflection
Module Module1

Sub Main()
Dim assem As Assembly Assembly.LoadFrom("C:\Users\s.simon\Documents\Visual Studio
2008\Projects\ConsoleApplication2\ClassLibrary1.dll")
Dim o As Object = assem.CreateInstance("ClassLibrary1.Class1")
Dim cls As ClassLibrary1.Class1 = DirectCast(o,
ClassLibrary1.Class1)
Debug.WriteLine(cls.F1)
End Sub

End Module
///

Das Ergebnis ist eine InvalidCastException:
"Das Objekt des Typs ClassLibrary1.Class1 kann nicht in Typ
ClassLibrary1.Class1 umgewandelt werden."


Ich könnte natürlich auch folgendes machen:

\\\
Imports System.Reflection
Module Module1

Sub Main()
Dim asm As Assembly Assembly.LoadFile("C:\Users\s.simon\Documents\Visual Studio
2008\Projects\ConsoleApplication2\ClassLibrary1.dll")
Dim cls As Object = asm.CreateInstance("ClassLibrary1.Class1")
Debug.WriteLine(F1(cls))
End Sub

Private Function F1(ByVal cls As Object) As Int32
Dim m As MethodInfo = cls.GetType.GetMethod("F1")
Dim ret As Object = m.Invoke(cls, Nothing)
Return DirectCast(ret, Int32)
End Function

End Module
///

Das funktioniert zwar, aber übersichtlicher fànde ich, wenn erstere Variante
umsetzbar wàre. Gibts da eine Möglichkeit?

tia
Stefan
 

Lesen sie die antworten

#1 Stefan Simon
18/09/2008 - 11:47 | Warnen spam
Dim o As Object = assem.CreateInstance("ClassLibrary1.Class1")
Dim cls As ClassLibrary1.Class1 = DirectCast(o,
ClassLibrary1.Class1)
Debug.WriteLine(cls.F1)



PS: ich könnte auch auf das casten verzichten und für die Release Version o
als Object statt als benannte Klasse verwenden, Strict Off schalten und den
Verweis entfernen. Funktionieren tut das, und es ist schnell umgesetzt, aber
ist es auch ratsam?

Ähnliche fragen