Gateway_man Geschrieben 3. Mai 2013 Teilen Geschrieben 3. Mai 2013 Hallo, ich versuche aktuell verzweifelt und erfolglos einen Funktionszeiger per Latebinding zu generieren. Er steigt jedesmal bei "CreateDelegate" mit folgender Fehlermeldung aus: "Fehler beim Binden an die Zielmethode." (Noch nichtssagender geht es nicht). Das einzige was ich noch erhalte ist die Hresult Nummer (-2147024809) mit der ich aber auch nichts herausgefunden habe. Nachfollgend noch der enstprechende Codepart. Das zweite Codesnippet stammt aus der dll, welche per Latebinding angebunden wird. (Dort ist auch das Delegate definiert!). private bool CreateDelegates() { bool lresult = false; try { if (interopAssemb != null) { bool success = true; Type tempType = null; MethodInfo mInfo = null; List<MethodInfo> functions = this.GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Instance).ToList(); tempType = interopAssemb.GetType("Interop.BeginLoad"); if (tempType != null) { mInfo = functions.Find(P=>P.Name.Contains("BeginLoad")); if (mInfo != null) { beginLoadDel = Delegate.CreateDelegate(tempType, mInfo); } } else { success = false; } lresult = success; } } catch (Exception ex) { Logger.LogException(ex); } return lresult; } //Das ist die Funktion auf die mit dem Delegate gezeigt werden soll..... private void BeginLoad() { } Das Delegate das in der per Latebinding angebundene Dll definiert wurde, sieht wie folgt aus: public delegate void BeginLoad(); Seht ihr einen Fehler oder habt eine Vermutung? Lg Gateway Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
realgun Geschrieben 5. Mai 2013 Teilen Geschrieben 5. Mai 2013 Hi, bei Deiner verwendeten Überladung von "Delegate.CreateDelegate(Type, MethodInfo)" muss der Delegat "BeginLoad" auf eine statische Methode zeigen. Sonst solltest Du die Instanz mit angeben, in der "erstellte" Delegate die Methode aufrufen soll: MSDN Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gateway_man Geschrieben 6. Mai 2013 Autor Teilen Geschrieben 6. Mai 2013 (bearbeitet) Hallo, das Problem ist bereits größtenteils gelöst. Ich habe jetzt entsprechende Funktionen geschrieben, welche die Funktionsszeiger übergeben (über Pointer welche dann in der Ziel Library wieder zu Delegates werden). Das funktioniert soweit sehr gut. private bool RegisterBeginLoad() { bool lresult = false; try { if (obj != null && beginLoadDel != null) { lresult = (bool)baseType.GetMethod("RegisterBeginLoad").Invoke(obj , new object[] { Marshal.GetFunctionPointerForDelegate(beginLoadDel), typeof(BeginLoadEx) }); } } catch { } return lresult; } Folgende Klasse befindet sich in der Dll die per Latebinding angebunden wird. Diese Klasse kümmert sich um die Auflösung des Pointers. public sealed class LBDelegateEx { #region Properties public IntPtr FuncPtr { get; private set; } public Type SrcType { get; private set; } private Delegate TargetPtr { get; set; } #endregion #region constr public LBDelegateEx(Type type, IntPtr ptr) { SrcType = type; FuncPtr = ptr; if (SrcType != null && FuncPtr != IntPtr.Zero) { TargetPtr = Marshal.GetDelegateForFunctionPointer(FuncPtr, SrcType); } } #endregion #region Destructor ~LBDelegateEx() { TargetPtr = null; SrcType = null; FuncPtr = IntPtr.Zero; } #endregion #region Functions public Delegate AccessDelegate() { return TargetPtr; } #endregion } Das einzige Problem das ich jetzt noch habe ist, das Funktionsargumente nicht referenziert übergeben werden. Kennt sich da jemand aus? Selbst wenn die Funktion mit ref arbeitet funktioniert das nicht. Hier ein Beispielaufruf in der per Latebinding angebundenden Dll. onPrinting.DynamicInvoke(new object[] { tempDir, printerDevice, resolution, dpi, quality, showPreview }); Wenn ich den Wert von tempDir (string) innerhalb der Funktion ändere bekomm ich das nicht mit (da die variablen scheinbar nicht referenziert übergeben werden!). Wie schaff ich es das die Argumente beim Invoken referenziert übergeben werden? LG Gateway [uPDATE] (Resolved!): Was für ein Unsinn. Das ist die Funktion die aufgerufen wird: private bool OnPrintProcessStart(ref string tempDir,ref string printerDevice,ref System.Drawing.Size resolution,ref double dpi,ref int quality,ref bool showPreview) { tempDir = "das ist ein test!"; return false; } Wenn ich die Funktion wie folgt Invoke, wird nicht referenziert: onPrinting.DynamicInvoke(new object[] { tempDir, printerDevice, resolution, dpi, quality, showPreview }); Wenn ich aber alle diese Argumente in ein Object Array verpacke: object[] args = new object[] { tempDir, printerDevice , resolution, dpi, quality, showPreview }; bool lresult = (bool)onPrinting.DynamicInvoke(args); Werden die Argumente referenziert übergeben. Was für ein schwachsinn . Bearbeitet 6. Mai 2013 von Gateway_man Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.