Schnittstelle wird irgendwie nicht berücksichtigt



  • Hallo zusammen,

    mein erster Beitrag in diesem Forum. Ich bin neu in Sachen C++ und dotnet. Meine Software kann PlugIns einladen. Bis jetzt habe ich einige PlugIns in C geschrieben dafür, was auch prima ging. Aber bei dem folgenden weiß ich einfach nicht weiter und mache wahrscheinlich einen ganz derben Anfänger Fehler:

    Im Klassenkopf implementiere ich die beiden Schnittstellen IPlugIn und IMsgAdapter. Mein Programm sucht in den DLL Dateien nacheinander nach dem Interface-Namen IPlugIn. Wird es gefunden, dann lädt er die Types usw. Halt die Reflection in dotnet. Alle Plugins die nur die Schnittstelle IPlugIn implementieren werden von meinem Prog auch geladen, aber wenn ich zusätzlich in diesem PlugIn noch die IMsgAdapter implementieren möchte, dann kommt beim einladen keine Fehlermehldung, aber das PlugIn wird auch nicht geladen. Lösche ich das ", public IMsgAdapter" wieder, dann gehts wieder.

    Die kommentare sind die Vertragsmethoden der IMsgAdapter. Muss ich was anderes schreiben, wenn ich zwei Interfaces implementieren will? Was mache ich falsch?
    Vorab danke für die Hilfe:

    #pragma once
    
    using namespace System;
    using namespace CirculiSDK::PlugIns;
    using namespace CirculiSDK::Messages;
    using namespace System::Windows::Forms;
    
    #include "Frm1.h"
    
    namespace Plugin
    {
    public __gc class Class1 : public IPlugIn, public IMsgAdapter
    	{
    
    	public:
    		void Start()
    		{
    		}
    
    		PlugInProperties Load(MsgSender *Sender,PlugInProperties Prop,System::String *MyKey)
    		{
    
    	  	Prop.DateOfVersion = "01.01.2005";
            	Prop.Descripton = "Beschreibung";
            	Prop.ItemEnabled = true;
            	Prop.ItemVisible = true;
    		Prop.License = IPlugIn::Licenses::Freeware;
    		Prop.MenuItem = IPlugIn::MenuItems::MnuDatei;
            	Prop.PlugInName = "Beispiel3";
            	Prop.Stabil = true;
            	Prop.SubMenuName = "Tut-Beispiele";
            	Prop.Version = "1.0";
    		return Prop;
    		}
    
    		/*Object *Message(MsgSender *Sender,IMsgAdapter::Messages *TheMessage,Object *Obj)
    		{
    			return 0;
    		}
    
    		Object *Message(MsgSender *Sender,String *TheMessage, Object *Obj)
    		{
    			return 0;
    		}*/
    
    	};
    }
    


  • Glaube hilfreicher als das Plugin, wäre die Methode wie du die Plugins lädst.
    Vielleicht liegt da irgendwo nen fehler, weil das Plugin sieht ja "harmlos" aus.



  • kein Problem. Die SDK, wo auch die Methode drin ist, ist halt nur in VB.Net geschrieben:

    Public Function LoadPlugIns(ByVal PlugInPath As String, ByVal Sender As MsgSender, ByVal InterfaceName As String) As CPlugIns
    
                Dim objects As CPlugIn
                Dim plist As New CPlugIns
                Dim path As String
                Dim plugin As IPlugIn
                Dim test As CirculiSDK.PlugIns.IPlugIn.PlugInProperties
                Dim strdlls() As String
                Dim strdlls2() As String
                Dim intindex As Integer
                Dim objDLL As [Assembly]
                Dim objPlugin As Object
                Dim objtype As Type
                Dim types As Type
                Dim objinterface As Type
                Dim mnuitem As MenuItem
                Dim dirs As String() = Directory.GetDirectories(PlugInPath)
                Dim dir As String
                Dim Mnuindex As Integer = -1
                Dim file As File
    
                For Each dir In dirs
                    path = dir & "\"
                    If file.Exists(LCase(path & "\CirculiSDK.dll")) Then
                        file.Delete(LCase(path & "\CirculiSDK.dll"))
                    End If
                Next
    
                For Each dir In dirs
                    path = dir & "\"
    
                    'Suchen
                    strdlls = Directory.GetFileSystemEntries(path, "*.dll")
    
                    Try
    
                        For intindex = 0 To strdlls.Length - 1
                            objDLL = [Assembly].LoadFrom(strdlls(intindex))
    
                            For Each objtype In objDLL.GetTypes
    
                                If objtype.IsPublic = True Then
    
                                    If Not ((objtype.Attributes And TypeAttributes.Abstract) = TypeAttributes.Abstract) Then
                                        objinterface = objtype.GetInterface(InterfaceName, True)
    
                                        If Not (objinterface Is Nothing) Then
    
                                            'Index für Menü setzen
                                            plugin = CreateInstance(strdlls(intindex), objtype.FullName)
                                            test = New CirculiSDK.PlugIns.IPlugIn.PlugInProperties
                                            Dim sec As New CirculiSDK.SystemData.Security
                                            test = plugin.Load(Sender, Nothing, sec.CreateKey2(strdlls(intindex)))
                                            sec = Nothing
    
                                            Mnuindex = -1
                                            Select Case test.MenuItem.ToString
                                                Case "MnuDatei"
                                                    Mnuindex = 1
                                                Case "MnuBearbeiten"
                                                    Mnuindex = 2
                                                Case "MnuAnsicht"
                                                    Mnuindex = 3
                                                Case "MnuEinfügen"
                                                    Mnuindex = 4
                                                Case "MnuFormat"
                                                    Mnuindex = 5
                                                Case "MnuFenster"
                                                    Mnuindex = 6
                                                Case "MnuExtras"
                                                    Mnuindex = 7
                                                Case "MnuFragezeichen"
                                                    Mnuindex = 8
                                            End Select
    
                                            If Not test.PlugInName = "" Then
                                                objects = New CPlugIn
                                                With objects
                                                    .ClassName = objtype.FullName
                                                    .Description = test.Descripton
                                                    .ItemEnabled = test.ItemEnabled
                                                    .ItemVisible = test.ItemVisible
                                                    .License = test.License.ToString
                                                    If test.BackgroundPlugIn = True Then
                                                        .MnuIndex = -1
                                                        .MenuItem = ""
                                                    Else
                                                        .MenuItem = test.MenuItem.ToString
                                                        .MnuIndex = Mnuindex
                                                    End If
                                                    .MnuItemIndex = -1
                                                    .MnuSubIndex = -1
                                                    .Path = strdlls(intindex)
                                                    .PlugInName = test.PlugInName
                                                    .PlugInObject = plugin
                                                    .Receiver = test.Receiver
                                                    .Stabil = test.Stabil
                                                    .SubMenu = test.SubMenuName
                                                    .Version = test.Version
                                                    .VersionDate = test.DateOfVersion
                                                    .DLLName = objDLL.GetName.Name
                                                End With
                                                'PlugIn hinzufügen
                                                plist.Add(objects)
    
                                                'PlugInTypes hinzufügen
                                                For Each types In objDLL.GetTypes
                                                    If types.IsPublic = True Then
                                                        Dim t As New CirculiSDK.PlugIns.CPlugInType
                                                        t.TypeName = types
                                                        objects.CPlugInTypes.Add(t)
                                                        t = Nothing
                                                    End If
                                                Next
    
                                                objects = Nothing
                                                test = Nothing
                                            End If
    
                                            plugin = Nothing
                                        End If
    
                                    End If
    
                                End If
    
                            Next
    
                        Next
    
                    Catch ex As Exception
                        MSG("", "CirculiSDK.PlugIns.PlugInAdministration.LoadplugIns", ex.StackTrace, Replace(FindMessage("0034"), ":::PLUGIN:::", strdlls(intindex)))
                    End Try
                Next
    
                LoadPlugIns = plist
                plist = Nothing
    
            End Function
    

Anmelden zum Antworten