2010-12-14 14 views
0

Visual Studio 2008 - Framework 3.5 - Visual Basicseltsames Problem mit Reflexion und statische Methode

Hallo! Ich habe ein Problem mit einer statischen Methode, die durch Reflektion aufgerufen wird. Beim Laden meines win-wpf erstelle ich eine Kopie von "A4Library.dll" mit dem Namen "_temp.dll", im selben Verzeichnis des Originals. Dann auf einem Button-Klick-Ereignisse, rufe ich eine statische Methode auf dem _temp.dll auf diese Weise:

Dim AssemblyFileName As String = Directory.GetCurrentDirectory() & "\_temp.dll" 
Dim oAssembly As Assembly = Assembly.LoadFrom(AssemblyFileName) 
Dim TypeName As String = "MyLibrary.MyService" 
Dim t As Type = oAssembly.GetType(TypeName) 
Dim mi As MethodInfo = t.GetMethod("MyMethod", BindingFlags.Static AndAlso BindingFlags.Public) 
Dim bResponse As Boolean = mi.Invoke(Nothing, New Object() {MyPar1, MyPar2}) 

Aber das funktioniert nur dann gut, wenn ich die EXE-Datei nicht im selben Verzeichnis der ist .dll Dateien, sonst erhalte ich diesen Fehler (übersetzt):

InnerException {"Cast unmöglich von [A] MyType auf [B] MyType. Der Typ A stammt aus ... im Kontext 'Default' in der Position 'F: \ MyPath \ A4Library.dll'. Der Typ B stammt von ... im Kontext 'LoadFrom' in der Position 'F: \ MyPath_temp.dll'. "}

Es ist seltsam: Es scheint zu ein Konflikt mit der gleichen Methode in der ursprünglichen .dll sein, aber ich kann nicht verstehen, warum es das Original und nicht auf der Kopie aussieht. Wenn die .exe-Datei, die sich auf die Prinzipal-Assembly bezieht, in einem anderen Verzeichnis gespeichert wird, wird alles ordnungsgemäß ausgeführt.

Ich brauche die .exe im selben Ordner der .dll, wie kann ich das Problem lösen?

Vielen Dank! Pileggi

Antwort

1

Warum eine Kopie der Baugruppe erstellen, bevor die statische Methode ausgeführt wird? Wenn eine Kopie erstellt werden muss, laden Sie diese Assembly in eine andere AppDomain und führen Sie die Methode dort aus.

+0

Vielen Dank! Ich muss dies tun, weil ich manchmal die .dll ersetzen muss und ich denke, es ist ziemlich schwer, die Laufzeit einer bereits geladenen Assembly zu entladen. – lamarmora