Folgendes Szenario (ähnlich wie Freddy es in seinem Blog vor einigen Monaten geschildert hat): Eine Datei soll vom RTC auf den Server transferiert werden. Dazu werden zwei Automation-Objekte verwendet, die die Datei base64 codieren bzw. decodieren.
Folgender Quellcode in NAV:
- Code: Alles auswählen
// create necessary automations
IF (ISCLEAR(Decoding)) THEN
IF NOT (CREATE(Decoding, TRUE, FALSE)) THEN
ERROR(txtAutomationInstanciationErr, 'Decoding');
IF (ISCLEAR(Encoding)) THEN
IF NOT (CREATE(Encoding, TRUE, TRUE)) THEN
ERROR(txtAutomationInstanciationErr, 'Encoding');
// open file via automation and store in base64String
// what happens on error in 'Encoding.encodeFile'?
base64String.ADDTEXT(Encoding.encodeFile(sourceFile));
// Decode the base64 encoded file into the tmpFile
ErrorCode := Decoding.decodeToFile(base64String, targetFile);
Auf dem Client wird die Automation Encoding erstellt, die für das Übersetzen in einen String zuständig ist, auf dem Server die, die den String wieder zurückübersetzt. Dazwischen wird der String in einen BigText übersetzt. Kompiliert wird das ganze problemlos.
Während der Laufzeit kommt es aber zu folgender Fehlermeldung:
Meldung fĂĽr C/AL-Programmierer: Fehler beim Aufruf von Member 'decodeToFile': Die Methode "DropZone.Automations.Base64Decoding.decodeToFile' konnte nicht gefunden werden.
D.h. das Encoding funktioniert noch...
Das hier ist der .NET-Code (leicht gekĂĽrzt):
- Code: Alles auswählen
namespace DropZone.Automations
{
[Guid("B1E4786B-F32E-481c-AF6C-4004D6E67864")]
public interface IDecoding
{
[DispId(1)]
int decodeToFile(StringBuilder base64String, string filename);
}
/// <summary>
///
/// </summary>
[ClassInterface(ClassInterfaceType.None)]
[Guid("2FB58F9C-9E3B-48b0-8841-4B105D434E67")]
public class Base64Decoding : IDecoding
{
/// <summary>
///
/// </summary>
/// <param name="base64String"></param>
/// <param name="filename"></param>
/// <returns></returns>
public int decodeToFile(StringBuilder base64String, string filename)
{
try
{
System.IO.Directory.CreateDirectory(filename.Substring(0,filename.LastIndexOf('\\')));
System.IO.File.WriteAllBytes(filename, Convert.FromBase64String(base64String.ToString()));
return 0;
}
#region ExceptionHandling
[...]
#endregion
}
}
}
Ich habe schon versucht, alle evtl. bestehenden älteren Versionen der dll zu entfernen, die dll in den GAC zu laden, diese Klasse in eine eigene Dll auszulagern. Alles ohne Erfolg.
Ich wäre sehr dankbar für weitere Vorschläge.