Zum Inhalt springen

[C#] CreateDelegate & LateBinding


Gateway_man

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :rolleyes:.

Bearbeitet von Gateway_man
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...