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