[Gelöst] Zugriff auf .NET Klasse aus AX

15. Februar 2011 17:32

Hallo zusammen,

in Visual Studio 2010 habe ich eine Klassenbibliothek (.NET 3.5) erstellt und diese in das AX Client Verzeichnis kopiert.

Die Klasse enthält statische Methoden, auf die ich versuche aus AX 2009 zuzugreifen. Gebe ich Namespace.Klassenname::Methodenname ein, erhalte ich auch richtig die Parameter angezeigt.
Wenn ich dann alle Parameter angegeben habe und mit F7 den Compiler durchrattern lasse, bekomme ich den Fehler:

"The Class Namespace.Klassenname does not contain this function."

Bin momentan etwas ratlos, da IntelliSense (heißt das in AX so? :-) ) mir ja die Parameter richtig anzeigt...hat jemand vlt eine Idee?
Zuletzt geändert von Axhalaisom am 18. Februar 2011 12:59, insgesamt 1-mal geändert.

Re: Zugriff auf .NET Klasse aus AX

15. Februar 2011 19:50

Hi,

folgendes solltest du gemacht haben:

1. Assembly (classlibrary) in VS erstellt.
2. Assembly in das client\bin verzeichnis kopieren
3. Im AOT-Knoten Refernces eine neue refernz zu der Assembly hinzufügen.

Kannst du genaueres zu der .NET Funktion sagen? Parameter, Rückgabewerte, etc.

Hast du diese nach dem Hinzufügen der Refernz nochmals geändert?

Re: Zugriff auf .NET Klasse aus AX

16. Februar 2011 11:59

Hi,

das ging ja fix :-)

1.-3. habe ich gemacht und die dll hat sich nach dem Hinzufügen noch öfter mal geändert. Ich hab die aber auch schon mehrmals neu eingebunden um den Fehler auszuschließen. Selbst den AOS hab ich neugestartet, obwohl das eigentlich nicht nötig sein dürfte, bei Code der auf dem Client ausgeführt wird.

In der dll sind zwei Klassen definiert. Die eine Klasse hat mehrere statische Methoden, die Funtionen aus der kernel32.dll, user32.dll usw. nutzen. Innerhalb von diesen Methoden wird jeweils eine Instanz der zweiten Klasse erstellt und dort Methoden aufgerufen. Dazu folgendes Beispiel, das zwar keinen Sinn macht, aber dem prinzipiellen Aufbau entspricht :-)

Code:
[DllImport("kernel32.dll")]
public static extern bool Beep(int frequency, int duration);
     
public static int beep(int parm1, string parm2, DateTime parm3)
{           
    Class2    class = new Class2();

    if (class.methode()      == xy)
    {
        Beep(1,2);
        return 0;
    }
    else
    {
        Beep(2,3);
        return 1;
    }               
}


Ich habe gestern in AX noch eine andere Möglichkeit als den direkten Aufruf entdeckt, es gibt noch die Möglichkeit über CLRInterop::staticInvoke(...) statische Methoden aufzurufen...da bekomme ich aber die gleiche Fehlermeldung, nur anders präsentiert :-(

In der Zwischenzeit habe ich noch hier und da experimentiert. Wenn ich die Klasse, die die ganzen Funktionen der kernel32.dll usw. verwendet, in ein neues VS Projekt kopiere und die Aufrufe der anderen Klasse auskommentiere, meckert der AX Kompiler nicht.
Es liegt also die Vermutung nahe, dass hier irgendwo der Fehler liegt. Ich werd mal versuchen einen Debugger Aufruf innerhalb der dll zu erzwingen.

Re: Zugriff auf .NET Klasse aus AX

18. Februar 2011 13:00

Hi,

Problem gelöst, eigentlich hätte ich da früher drauf kommen können...

Die statischen Methoden aus der .NET Klasse besitzen teilweise einen int Parameter.
Wenn ich in diesen int32 Parameter aus AX ein int übergeben will, meckert der Compiler und behauptet die Methode würde nicht existieren.


Code:
int                 axInteger;
System.Int32        i;

;

i = axInteger;

namespace.klasse::methode(i);


Macht man es so, funktioniert es. Die Meldung des AX Compilers ist einfach nur :roll:

Re: [Gelöst] Zugriff auf .NET Klasse aus AX

19. Februar 2011 22:42

Hi,

Axhalaisom hat geschrieben:Problem gelöst...
..wenn ich in diesen int32 Parameter aus AX ein int übergeben will, meckert der Compiler..

Code:
int axInteger;
System.Int32 i;
;
i = axInteger;
namespace.klasse::methode(i);


Macht man es so, funktioniert es..


du kannst natürlich auch den Ax-Datentyp in einen CLR-Datentypen konvertieren.
Damit sollte man sich den Umweg über eine zusätzliche CLR-Variable sparen können.

Beispiel:
Code:
int axInteger;
;
namespace.klasse::methode(CLRInterop::getObjectForAnyType(axInteger));


Typumwandlungen von NET zu AX funktionieren natürlich auch. Hierfür kann "ClrInterop::getAnyTypeForObject" verwendet werden.

Mehr hierzu steht auch im MSDN:
CLRInterop::getObjectForAnyType Method
CLRInterop::getAnyTypeForObject Method