Avatar billede r_just Nybegynder
14. juli 2008 - 11:39 Der er 16 kommentarer

Dynamisk load af dll.

Jeg har en ekstern dll,som jeg gerne vil bruge i min
program. 

Dim asm As Reflection.Assembly = Reflection.Assembly.LoadFrom("C:\test\Min_dll.dll")

hvordan kalder jeg dll's objecter
er der nogen der har nogen gode eksempel?
Avatar billede arne_v Ekspert
14. juli 2008 - 15:04 #1
Dim o As Object = [Assembly].Load("Util").CreateInstance("Util")
            o.GetType().InvokeMember("Test", _
                                    BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Static Or BindingFlags.InvokeMethod, _
                                    Nothing, Nothing, Nothing)

laver et kald via reflection.

Normalt vil man lave:

KnownInterface o2 = CType(o, KnownInterface)

og saa kalde metoder paa o2.
Avatar billede r_just Nybegynder
15. juli 2008 - 12:26 #2
Tak
Jeg fandt lige denne link.
http://www.vbdotnetheaven.com/UploadFile/rahul4_saxena/Reflection09122007031247AM/Reflection.aspx

Jeg få en fejl ved CreateInstance "MissingMethodException" ?

Måske findes der en anden metode.
Jeg har prøvet at add dll til references og sat copy local til false.
Det hele virker når jeg køre mit program.
Det eneste jeg gerne vil, er fortælle mit program hvor
dll filen er placeret.
Avatar billede arne_v Ekspert
16. juli 2008 - 04:06 #3
Den artikel er lidt "speciel".

Brug InvokeMember eller cast til et kendt interface, som jeg skrev.

Virker det ikke så post din kode, så vi kan se hvor det går galt.
Avatar billede r_just Nybegynder
16. juli 2008 - 13:06 #4
Hej
Her er min code
men jeg tror jeg gør noget forkert i forhold til dll.
Jeg ville også gerne havde postet dll, men man kan jo ikke
ved hæfte filer her inde eller hvad?

jeg håber at du kan hjælpe mig.

Dim m_Ticket As String
        Dim m_UserId As Long

        'hvis dll er add  manuel i Referencers henter flg. ud af dll
        If Connectivity.InventorAddin.EdmAddin.EdmSecurity.Instance.IsSignedIn = False Then
            m_host = Connectivity.InventorAddin.EdmAddin.EdmSecurity.Instance.GetEdmSecurityContext.RemoteHost
            m_Ticket = Connectivity.InventorAddin.EdmAddin.EdmSecurity.Instance.GetEdmSecurityContext.Ticket
            m_UserId = Connectivity.InventorAddin.EdmAddin.EdmSecurity.Instance.GetEdmSecurityContext.UserID
        End If

        ' Dynamisk load af dll
        Dim asm As System.Reflection.Assembly
        Dim t As Type()
        Dim ty As Type
        Dim m As MethodInfo()
        Dim mm As MethodInfo

        Dim Dll_location As String = oApp.InstallPath & "\Bin\"
        Dim o As Object
        asm = System.Reflection.Assembly.LoadFrom(Dll_location & "Connectivity.InventorAddin.EdmAddin.dll")
        ty = asm.GetType("Connectivity.InventorAddin.EdmAddin.EdmSecurity")
        m = ty.GetMethods
        For j As Integer = 0 To m.Length - 1
            If m(j).Name = "IsSignedIn" Then
                MsgBox(m(j).ToString)
            End If
        Next j
        o = Activator.CreateInstance(ty) ' det er her der kommer fejl

        MsgBox(ty.GetType.InvokeMember("IsSignedIn", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Static Or BindingFlags.InvokeMethod, Nothing, Nothing, Nothing))
Avatar billede arne_v Ekspert
19. juli 2008 - 05:39 #5
Stadigvæk "MissingMethodException" ?

Hvis ja så gætter jeg på at klassen ikke har en constructor uden argumenter !

(de skal så angives)
Avatar billede r_just Nybegynder
19. juli 2008 - 09:15 #6
Ja har stadig fejlen
Jeg tro godt nok jeg er løbet tør få talent.

http://www.datatrans.dk/da/file/89/Connectivity-InventorAddin-EdmAddin-dll.html
Avatar billede r_just Nybegynder
19. juli 2008 - 09:33 #7
Jeg tror det lige gik stækt nok, med at få poste kommentar.
jeg tror ikke jeg har forstået, det du mener med at klasser skal angives.
jer har lige oploaded dllen. Hvis du har tid kan du jo lige kigge på den.
Avatar billede arne_v Ekspert
19. juli 2008 - 15:38 #8
Klassen er en singleton med en private constructor - du er nødt til at kalde
Instance propertyen for at få fat i instansen.
Avatar billede r_just Nybegynder
19. juli 2008 - 16:45 #9
Jeg tror der noget jeg ikke hel har forstået, hvordan kalder jeg Instance propertyen skal jeg ikke bruge gettype?
den er lig Nothing.

asm = System.Reflection.Assembly.LoadFrom(Dll_location & "Connectivity.InventorAddin.EdmAddin.dll")
ty = asm.GetType("Connectivity.InventorAddin.EdmAddin.EdmSecurity.Instance")
Avatar billede arne_v Ekspert
19. juli 2008 - 19:07 #10
Nej.

Properties skal entehn hentes med Invoke eller GetValue (som er lidt nemmere at bruge).
Avatar billede r_just Nybegynder
19. juli 2008 - 22:39 #11
Nu har jeg fået fat i Instance, men hvordan får jeg fat i
instansens properties?

Dim asm As System.Reflection.Assembly
        Dim ty As Type
        Dim m As PropertyInfo()
        Dim x As PropertyInfo
        Dim Dll_location As String = oApp.InstallPath & "\Bin\"
        asm = System.Reflection.Assembly.LoadFrom(Dll_location & "Connectivity.InventorAddin.EdmAddin.dll")
        ty = asm.GetType("Connectivity.InventorAddin.EdmAddin.EdmSecurity")
        m = ty.GetProperties
        For j As Integer = 0 To m.Length - 1
            If m(j).Name = "Instance" Then
                x = m(j)
            End If
        Next j
Avatar billede arne_v Ekspert
19. juli 2008 - 23:07 #12
Stadigvæk reflection.

Enten Invoke eller GetProperties.
Avatar billede r_just Nybegynder
20. juli 2008 - 21:36 #13
Jeg har næsten prøvet alt med getproperties ude held.
jeg kan ikke få fat i Instansens properties. Hjælp...
Avatar billede arne_v Ekspert
21. juli 2008 - 04:22 #14
Hvis pi er din PropertyInfo for den property du vil hente, så kan du bruge:

pi.GetValue(ditobjekt, Nothing)
Avatar billede arne_v Ekspert
29. august 2008 - 02:49 #15
OK ?
Avatar billede arne_v Ekspert
28. oktober 2008 - 03:07 #16
?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester