Hilfe beim Erstversuch eine Dll in Verbindung mit DCM zu nutzen

lireiner

Mitglied
Teammitglied
Hallo an alle,
ich habe mich jetzt echt an einen Dll Aufruf über eine DCM herangetraut.
Leider wird die DCM entweder nicht ausgelöst, oder das Debuggen aus VS2015 ist nicht korrekt konfiguriert.
Jedenfall wird meine dll nicht angesprungen, bzw ich erreiche keinen Break in VS.

Kann mir jemand für Dumme schildern wie genau die Konfiguration sein muss.
Bitte alle Einzelheiten als Checkliste, irgendwie stelle ich mich zu blöd an.

Gruß Reiner
 
1. Richtig abgeleitet?
MyClas : IDcmCallback

2. DCM Registriert?
OL.DCM oder APP Designer => Lösung => Ereignisse

3. Wenn 1 & 2 == True
VS => Debuggen => An den Prozess anhängen?
 
Vielen Dank für die Antwort Sorin,
Punkt 1 & 2 = true (vb.Net ;-).
upload_2018-2-20_8-56-47.png
und... AD Ereigniss
upload_2018-2-20_8-59-57.png
in VS Eigenschaften/Debuggen
upload_2018-2-20_9-1-56.png
der AppServer ist beendet und wird durch den Consolen Aufruf sauber gestartet.
Trotzdem kein Einsprung in den Code?
Allerdings wird keine PDB Datei im Shared Ordner erzeugt, nur die dll liegt im Shared Verzeichnis, weil mein Ausgabeordner darauf eingestellt ist..
upload_2018-2-20_9-4-35.png
Ich habe leider keine Idee mehr? ;-(
 
.. ich hatte nach dem falschen Namen gesucht, die PDB Dateien sind doch im Shared Ordner vorhanden.

Ich starte das Debuggen über F5, dann wird automatisch im Consolen Fenster der ApplikationServer gestartet.
Danach starte ich die Wawi mit der vorhandenen Anmeldung.
Dann wird z.B der Belegdruck eines vorhandenen Belegs aufgerufen.
Eigentlich sollte nach meinem Verständnis die DCM ReportAfterRender, zeitgleich zur Anzeige des gedruckten Belegs in der Vorschau ausgelöst werden. Oder liege ich da falsch?
Das wiederum sollte einen Breakpoint in meinem VS Code anspringen. Tut es aber nicht ;-(. Bittte Hiiilfe !!!
Gruß Reiner
 
Zuletzt bearbeitet:
Hallo,

schauen Sie mal in der Sagede.Sagede.ApplicationServer.Core.config im Verzeichnis vom AppServer.
Dort sollte isolationModel="process" in isolationModel="appdomain" geändert werden.
Nur für Testzwecke(zum Debuggen).
Dann werden nicht viele Isolation-Prozesse erzeugt, sondern nur ein Windows.Service.
Außerdem schadet es nicht bei manchen DCM die MSAccess.exe per "An den Process anhängen..." auszuwählen.
 
Hallo Jan, Danke für die Info.

Die Sagede.ApplicationServer.Core.config und Sagede.ApplicationServer.SData.config sind entsprechend modifiziert.
Das mit "an Prozess anhängen..." habe ich noch einmal versucht.
Ich hatte das schon versucht, aber dann muss die Wawi zuvor gestartet sein, weil sonst der Prozess nicht zur Verfügung steht. Dere ApplikationServer muss dann zuvor auch gestartet sein, weil dann die Eigenschaftseinstellung "externes Programm starten" nicht mehr greift.
Witzigerweise habe ich gestern einen anderen Sachverhalt (Beleganpassung über den AppDesigner) durchgeführt, dabei wurde dann tatsächlich eine andere DCM BelegBeforeSave ausgelöst. Erkannt, habe ich es, an der Fehlermeldung beim Speichern des Belegs. Als ich den entsprechenden Code dann in VS im Debugg Modus F5 gestartet habe, gab es tatsächliche einen Einsprung in den Code.
In dem Bereich lag aber ein Fehler vor, deshalb ja auch die Fehlermeldung beim Beleg Speichern. Nach Korrektur des Fehlers im Code erneut gestartet, wieder kein Einsprung in den Code?
Ich war der Meinung alles ganau so gemacht zu haben, wie zuvor.

Ich denke um das mal Schritt für Schritt testen zu können, würde mir das genaue Vorgehen eines anderen Forenmitglieds helfen.
Dabei benötige ich eventuell auch alle Maßnahmen die eigentlich logisch erscheinen, die ich aber irgendwie nicht auf dem Zettel habe.
Eigentlich schon so wie das Sorin oben geschrieben hat, aber irgdwas muss bei mir noch fehlen.
Übrigens ist es ein Win7 OS.

Gruß Reiner
 
Ich habe einen Testserver zum Entwickeln und debugge remote. Es läuft alles schon auf dem Testcomputer bzw. alles ist gestartet und dann hänge ich mich an Sagede.ApplicationServer.WindowsService.exe (manchmal auch an MSACCESS, aber nicht immer). Ich hänge ein paar Bilder an, vielleicht fällt Ihnen was auf.
debug1.jpg debug2.jpg debug3.jpg
 
Hab genau den selben Spaß. Der ignoriert meine DLL komplett. Nach einem Tag suchen reicht mir das jetzt erstmal.
Werd jetzt ne CM machen (über Aufgabencenter) das reicht in meinem Fall erstmal und ist ja nicht so, dass man keinen Zeitdruck hat.
Wenn ich dann mal Langeweile hab guck ich noch einmal.
 
Also, mein Ergebnis...
Irgendwann habe ich ein Projekt aus den Beispielen der DevCon 2016 zum laufen bekommen und dort spingt die entsprechnde Funktion auch in den Code, wenn ein BreakPoint gesetzt ist.
Das bedeutet aber das die Hinterlegung meine DCM über den AppDesigner nicht korrekt ist, denn offensichtlich wird das von mir benötigte Ereignis nicht korrekt ausgelöst.
Hier meine Hinterlegung...
upload_2018-3-16_12-20-21.png
Wie zu erkennen ist bei den Ereignissen, eigentlich kein Hexenwerk, aber irgendwie funktioniert es nicht. Eventuell sieht ja einer von Euch den Fehler.
Leider hat man im Tagesgeschäft viel zu selten und dann viel zu wenig Zeit bis zum nächsten Anruf, um sich grundsätzlich damit auseinander zusetzen.
Schönes WE.
Gruß Reiner
 
Versuchen mal in der OL.dcm einzubauen anstatt in der AppDesigner. Falls Sie einen ApplicationServer haben dann dort und auch dort wo die Sage Anwendung läuft. Am besten danach den/die Server neu starten.
 
Ja gut,
klar könnte man das über ein AddIn in der ol.dcm machen, aber genau das wollten wir ja nicht mehr.
Eigentlich ist es eine wirklich schöne Möglichkeit das als Ereigniss in den AD einzubauen.
Nur funktionieren sollte es eben.

Hat denn jemand Erfahrung mit genau der DCM "ReportAfterRender"?
Ich benötige es um nach der Erstellung des Reports im Belegbereich eine PDF zu erzeugen und diese dann in einem Ordner auf dem Server abzulegen. Einfach zusätzlich zu jeder Aktion der Sage100.
Wenn also jemand andere Beispiele dafür hat, dann gerne her damit. Am liebsten als Code_Snipes.
Gruß Reiner
 
Über ein AddIn, wie soll das gehen? Ich meinte in der ol.dcm schreiben:

<DcmDefinitionList>
<Name>ReportAfterRender</Name>
<DcmDefinition>
<Name>MyHookPoint</Name>
<TypeName>xxx.DCMListener</TypeName>
<Priority>10</Priority>
<Description>My Hook point</Description>
<LibraryModel>2</LibraryModel>
<AssemblyIdentifier>xxx</AssemblyIdentifier>
<CheckVersion>False</CheckVersion>
</DcmDefinition>
</DcmDefinitionList>

und dann
public class DCMListener : IDcmCallback
{
public bool Entry(IDcmContext context)
{
try
{
switch (context.ListId)
{
case DcmDefinitionManager.DcmListId.ReportBeforeRender:
var reportContext = (Sagede.OfficeLine.Engine.DcmContextReportAfterRender)context;
.....
break;
 
Ach so, nee das würde ich nicht machen, wie gesagt in der OL.DCM im Shared Verzeichnis selbst eintragen.
 
Das kann man zwar so auch mal probieren, wäre aber nicht der von uns bevorzugte Weg, denn dann könnte man das nicht über ein Setup automatisieren, weil ja die ol.dcm nur bei der Installation eines AddIn automatische manipuliert würde.
Oder sehe ich das falsch?
 
Normalerweise sollte man auch nicht manuell dort was eintragen es gibt Helper Klassen die man in der Setup dafür nutzen sollte.
 
Ok, aber die Frage ist ja eigentlich, warum funktioniert denn das Ereignis aus dem AD nicht? Gibt es denn da noch Bugs?
Mir wäre ja die Variante über den AppDesigner die liebste weil es genau darum geht das darüber zu lösen.
 
Zurück
Oben