Cleanup Ressouces

63 views
Skip to first unread message

Rajik van Deymon

unread,
Dec 16, 2016, 2:59:58 AM12/16/16
to Konik ZUGFeRD Library
Hi,

ich habe wenig Erfahrung mit C#, habe es aber mit Hilfe des Beispiels geschafft eine Klassenbibliothek zu erstellen, auf die ich von externer Anwendung aus zugreifen und eine PDF/A Datei erstellen kann. Das einzige Problem ist, dass die DLL geladen bleibt. Sprich, alle Elemente die ich über addItem hinzugefügt habe, bleiben erhalten und werden in jeder neuen Rechnung immer weiter ergänzt. Ich finde keinen weg die Objekte zu leeren.

Rajik van Deymon

unread,
Dec 16, 2016, 8:30:42 AM12/16/16
to Konik ZUGFeRD Library
Ich vermute es fehlt einfach eine Dispose() Methode .

Daher habe ich versucht gemäß Netzbeispiel die Klasse NetExampleInvoice in einer eigenen Instanz in einer eigenen AppDomain zu starten, welche ich dann selbst wieder beenden kann.
Auf jeden Fall funktioniert es auch nicht. Wenn die Instanz erstellt werden soll tritt ein Fehler auf, das eine Zeichenlänge länger als 259 Zeichen ist.
Leider habe ich kaum Erfahrung mit C# und hoffe hier auf Hilfe.

Der Fehler müsste hier auftreten:
 NetExampleInvoice mbrt =
                (NetExampleInvoice)ad2.CreateInstanceAndUnwrap(exeAssembly, typeof(NetExampleInvoice).FullName); 



Der gesamte Quellcode:
public class ZUGFeRD
    {

        // Get and display the full name of the EXE assembly.
        private static string exeAssembly = Assembly.GetExecutingAssembly().GetName().FullName;
        private static AppDomain ad2 = GetAppDomain();
              private static NetExampleInvoice mbrt = GetInstance(ad2);

       

        public static AppDomain GetAppDomain()
        {
            
            // Construct and initialize settings for a second AppDomain.
            AppDomainSetup ads = new AppDomainSetup();
            ads.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; 
            ads.DisallowBindingRedirects = false;
            ads.DisallowCodeDownload = true;
            ads.ConfigurationFile =
                AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;

            // Create the second AppDomain.
            AppDomain ad2 = AppDomain.CreateDomain("AD #2", null, ads);
           
            return ad2;
        }
        public static NetExampleInvoice GetInstance(AppDomain ad2)
        {

            // Create an instance of MarshalbyRefType in the second AppDomain. 
            // A proxy to the object is returned.
            NetExampleInvoice mbrt =
                (NetExampleInvoice)ad2.CreateInstanceAndUnwrap(exeAssembly, typeof(NetExampleInvoice).FullName); 


            return mbrt;


        }
        public static void CloseInstance()
        {
            AppDomain.Unload(ad2);
        }

        public static void TestcreateInvoice (string DocNo, string SellToName) 
{
            mbrt.createInvoice(DocNo, SellToName);
        }
        public static void TestaddItem(string ItemNo, string PosNo, string ItemPrice)
        {
            mbrt.InvoiceAddItem (ItemNo, PosNo, ItemPrice);
        }
        public static void TestattachevoiceToPdf(string FileName)
        {
            mbrt.attachevoiceToPdf(FileName);
        }
        public static void TestvalidateInvoice()
         {
             mbrt.validate();
         }


    }




Vadim

unread,
Dec 16, 2016, 9:14:22 AM12/16/16
to Konik ZUGFeRD Library
NetExampleInvoice ist die Beispielklasse

Du musst deine eigne Klasse erstellen und das Invoice Objekt füllen.

Das was du suchst ist hier:

und hier 


Hier ist ein lauffähiges Beispiel:



Message has been deleted

Rajik van Deymon

unread,
Dec 17, 2016, 9:10:54 AM12/17/16
to Konik ZUGFeRD Library
Hi Vadmin,

ich habe den Code nochmal umstrukturiert. Das Problem war, dass ich die Klassen Global gemacht habe. Dadurch war die Klasse Trade immer noch von der vorhergehenden Rechnung gefüllt.


Reply all
Reply to author
Forward
0 new messages