10. März 2008 17:50
Ahh, ok. Hast du analog die Schritte zur C# DLL geprüft? Und auch für die NAV Variable die Events aktiviert (Eigenschaften der Variablen)?
10. März 2008 18:02
ja die NAV die Events in der Variable ist aktiviert.
Nein mit C# kenne ich mich nicht aus.
aber der Vergleich zu VB.Net und VB6.0 passt.
Das Tool geht soweit auch, er wirft mir auch die Daten in eine Msg Box aus. Landet nur nicht in NAV
12. März 2008 20:50
Hallo Eipel,
sorry, hab nicht wirklich realisiert, dass du von VB6 sprachst, obwohl es groß und breit da stand. Damit hab ich noch keine COM DLLs gebaut. Denke aber, dass es eigentlich straight forward sein sollte.
Sorry wenn ich so spät was dazu schreibe und dir in dem Punkt nicht wirklich weiter helfen kann. Solltest du bereits eine Lösung haben, dann interessiert das vielleicht auch andere und du könntest uns teilhaben lassen...
13. März 2008 10:47
Hallo SilverX,
danke nochmal für die Mühe.
Hier der Hintergrund:
Ich habe ein ActiveX in VB 6.0 für RFID Antennen geschrieben.
Ich haben festgestellt, dass die eingebundene MSComm nicht 100% Multitasking fähig auf Citrix Server, sprich Terminalserver ist.
Wir fragen für 6 Werken in ganz Deutschlang ca. 500.000 RFID Chips pro Tag mit RFID Antennen in Echtzeit ab.
Die Antennen sind mit unserem Navision 4 auf dem Citrixserver Farm über die ActiveX verbunden.
Das funktioniert auch tadellos!
Mein Problem ist einfach das wir Übersprünge an den Antennen haben. Jede Antenne hat ihre eigene ActiveX und Anwendung in Navision (Alles Saber getrennt).
Es ist nur so, dass mache ca. 1-2 % RFID Chips in den nicht zugehörigen Tabellen landen.
Ich habe in Foren gelesen, dass .net die Kanäle auf dem Terminalserver sauber trennt. Daher meine Programmierung in VB.Net. Was nicht wirklich läuft
Ich habe aber schon angefangen es in C# zu versuchen. Wenn ich die Anwendung fertig habe werde ich das Forum informieren.
Vielen Dank nochmal!
Gruß
Eipel
10. Juni 2008 16:32
hi. ich habe noch absolut keine erfahrung zu dem thema hier und würde gerne mehr wissen. daher wollte ich einfach mal das was SilverX direkt am anfang beschrieben hat durchspielen, habe aber irgendwie probleme, da ich meine DLL unter navision nirgends finden kann?!
vorweg: ich hab nen windows xp 64 und visual studio 2008
was ich bisher getan habe:
1. projekt erstellt, code übernommen, "build" gemacht
2. befehle für com registrieren ausgeführt
-> Types registered successfully - Assembly exported to '[...]\NavDll.tlb', and the type library was registered successfully
3.gac kopieren entsprechend ausgeführt, wobei mein gacutil unter ...Microsoft SDKs\Windows\v6.0A\Bin liegt.
-> Assembly successfully added to the cache
Im Dynamics Nav unter Custom Controls kann ich aber nichts entsprechendes finden, so dass ich auch keine entsprechende Global Automation einbinden kann...
10. Juni 2008 21:33
Die wirst du bei den Custom Controls nicht finden. Leg mal irgendwo eine Variable vom Typ Automation an und schau, ob du da mit F6 -> F6 fündig wirst.
Sollte ich falsch liegen, dann kann es bei dem x64 System noch daran liegen, dass du eine x64 Version compiliert hast, NAV aber 32-bit erwartet. Ggf. müssen auch beide Versionen im GAC liegen. Ich gebe zu, damit hab ich mich noch nicht so ausgiebig beschäftigt. Bisher liefen bei mir immer die 32-bit Varianten.
11. Juni 2008 11:50
danke für die antwort: es geht :)
ein wenig verwundet bin ich ja schon, ich war der meinung es schon vorher mit einer Automation versucht zu haben.
dennoch fehlt mir wirklich wissen/verständis im allgemeineren umfang. gibt es zu dem thema irgendwelche empfehlenswerte bücher/papers? für so fragen die nach diesem thread bei mir sofort aufkommen, wie...
- sowas wie GAC hab ich vorher nie gehört...
- woher weiß ich was für Guid´s oder DispId´s ich verwenden darf/muss/sollte?
- wieso hier zwingend ein Interface?
- was sind dann überhaupt die "custom controls"?
- oder einfach allgemein zum thema dynamics nav und dll´s
grüße und nochmals danke, der thread hier ist echt super nützlich
daniel
13. Juni 2008 07:26
Erstmal schön, dass es funktioniert :)
Den GAC (Global Assembly Cache) kannst du dir wie ein freigegebenes Verzeichnis vorstellen in dem .NET Assemblies liegen. Assemblies die im GAC installiert werden, müssen zwingend signiert sein mit einem Schlüssel. Man kann Assemblies auch in das Programmverzeichnis legen, ohne diese zu signieren oder in den GAC zu stellen. Dann können sie allerdings nur von der jeweiligen Anwendung benutzt werden und "verseuchen" die Installation.
Welche GUIDs du verwendest ist dir quasi freigestellt. Sie sollten allerdings immer global eindeutig sein, was GUIDs im allgemeinen sind (2^128 Möglichkeiten). Sie dienen rein der Identifikation. Genau so für die DispIDs. Diese sollten innerhalb der Assembly eindeutig sein.
Zu Interfaces findest du COM benötigt eine Beschreibung der jeweiligen Funktionen. Eine allgemeine Erlärung findest zu z.B. hier:
COM Interfaces.
Custom Controls sind "native" ActiveX Controls. Diese findest du als .OCX im Dateisystem. Diese müssen nicht Instanziiert werden (CREATE()). Weiterführend ggf. Google.
Und nun muss ich erstmal arbeiten gehen :)
1. Juli 2008 09:38
Hallo,
ein sehr schöner Beitrag.
Hab aber noch Fragen zum Interface:
- Wozu brauche ich das Interface? (Ich vermute mal für COM selbst, oder?).
- Kann ich die Events direkt in das Interface integrieren? Oder brauche ich das Interface und gehe in NAV trotzdem direkt über die Klasse um auf die Events in NAV zuzugreifen ("WithEvents")?
Würde nämlich gerne in NAV nur das Interface sehen (Klasse nicht über COM sichtbar) und bräuchte aber auch im Interface die Events.
Oder anders gefragt, was ist der Standardweg in NAV? Bin kein C#/COM Experte, aber sind Interfaces nicht dazu da, damit man nicht direkt auf die Klasse geht?
Ich freue mich schon auf eure Antworten
Gruß
NAiV
2. Juli 2008 11:34
die frage zu dem interface bezogen auf navision/com kann ich dir leider nicht wirklich beantworten.
zu deiner allgemeinen aussage "sind interfaces nicht dazu da, damit man nicht direkt auf die klasse geht" kann ich aber sagen, dass dies nicht der sinn von interfaces ist. interfaces spezifizieren halt nur methodensignaturen, aber keine logik an sich. damit kann man sicherstellen, dass klassen, die diese interfaces implementieren, auch wirklich alle gewünschten methoden bieten. man will einfach und effizient schnittstellen definieren können.
19. November 2009 16:51
HI zusammen,
ich habe es so gemacht wie von SilverX beschrieben (haarklein Punkt für Punkt)....jedoch erhalte ich folgende Fehlermeldung. Kann es irgendwie an .Net 3.5 liegen?
Folgende (wahscheinlich bekannte Fehlermeldung kommt):
fehler.gif
Ich bin für jegliche Hilfe dankbar!!!
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
20. November 2009 08:23
Hallo Andy,
die Meldung sieht für mich so aus, als wenn das Assembly zwar für COM sichtbar ist (sieht man daran, dass in der Meldung die Klasse sauber dargestellt ist, aber nicht für den Client im Zugriff, sprich, weder im Applikationsverzeichnis oder im GAC verfügbar.
Prüfe bitte, ob sich dein Assembly im GAC unter C:\WINDOWS\assembly befindet. Falls nicht, dann benutz nochmal das gacutil.exe.
7. November 2019 09:43
Hallo liebe Community
Leider scheitere ich beim verwenden meiner eigenen COM Dll in NAV 2009 Classic Client. Ich konnte die DLL erstellen und erfoglreich registrieren, aber diese tauch untern den Automations im Classic Client einfach nicht auf.
Folgendes habe ich gemacht:
C# Class Libary Projekt mit folgenden Eigeschaften:
ProjectProperties.png
BuildProperties.png
Und mit folgendem Code:
- Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;
namespace PDFBase64Converter
{
[ComVisible(true)]
[Guid("6E61CB6E-CA65-4840-8B64-A0FED5063C72")]
public interface IConverter
{
[DispId(0x8001)]
string ConvertPDFToBase64(string inputFilePath);
void ConvertBase64ToPDF(string base64, string outputFilePath);
}
[ClassInterface(ClassInterfaceType.None)]
[ProgId("PDFBase64Converter")]
[Guid("46785FD5-D11C-4760-B842-7659A800A599")]
public class Converter : IConverter
{
public string ConvertPDFToBase64(string inputFilePath)
{
byte[] pdfBytes = File.ReadAllBytes(inputFilePath);
string base64 = Convert.ToBase64String(pdfBytes);
return base64;
}
public void ConvertBase64ToPDF(string base64, string outputFilePath)
{
byte[] bytes = Convert.FromBase64String(base64);
File.WriteAllBytes(outputFilePath, bytes);
}
}
}
Danach habe ich mithilfe von folgenden Befehlen die DLL registriert:
- Code:
RegAsm.exe "D:\joshua\Workspace\dotNetLibaries\PDFBase64Converter\bin\Release\PDFBase64Converter.dll" /tlb:"D:\joshua\Workspace\dotNetLibaries\PDFBase64Converter\bin\Release\PDFBase64Converter.tlb"
gacutil.exe /i "D:\joshua\Workspace\dotNetLibaries\PDFBase64Converter\bin\Release\PDFBase64Converter.dll"
Das hat ohne Fehler funktioniert und die DLL werden auch im GAC von Windows angezeigt, ich habe auch extra sowohl eine X86 als auch eine Any CPU Version kompiliert und registriert.
COMAsseblies.jpg
Aber auch nach PC Neustart wird mir die DLL nicht bei den Automations im NAV 2009 Classic Client angezeigt:
AvaiableAutomations.jpg
Hat jemand eine Idee wieso die Automation nicht angezeigt wird oder was ich falsch geamcht habe?
Liebe Grüsse
Joshua
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
7. November 2019 10:13
Hallo,
welches Dotnet Framework unterstützt NAV 2009 eigentlich? Du hast da 3.5 drin, versuch es doch mal mit Version 2 und 32bit
Gruß Fiddi
7. November 2019 11:25
Hallo Fiddi, vielen Dank für den Input, NAV 2009 verwendet meines Wissens 3.5 (da auch zwingend 3.5 installiert werden muss das man überhaupt den NAV Clinet Installieren kann).
Ich habe es aber jetzt trotzdem mal mit Version 2.0 kompiliert und neu registriert, funktioniert leider trotzdem nicht.
7. November 2019 14:07
hi,
ich kann leider keinen hilfreichen Beitrag dazu verfassen, wollte aber aus purem Interesse wissen, warum du etwas für 2009 programmierst?
Das soll absolut kein Vorwurf sein, allerdings stellt sich mir die Frage, ob die investierte Zeit vielleicht nicht in einem Upgrade besser aufgehoben wäre?
7. November 2019 22:40
Nunja, also wir haben uns eine COM DLL schreiben lassen, *weil* wir ein Upgrade machen und wir auch andere Infrastruktur ändern, z.B. Saperion -> Doxis. Die DLL ersetzt das OCX womit das ECM angesprochen wird. In unserem Upgrade Szenario wandert viel Funktionalität aus NAV in andere Systeme. Führt dazu das wir im neuen NAV deutlich weniger Anpassungen haben werden. Nur muss man mehrere Migrationsschritte machen, weil der Patient muss ja am Leben bleiben.
In VS2017 (quasi aktuelles VS) sind die Anpassungen um eine Library auch COM Visible zu machen eher klein. Ich würde empfehlen das aktuelle VS zu nehmen, scheint einfacher geworden zu sein. Die DLL selbst ist in unserem Fall .net 4.6.2 und arbeitet problemlos mit NAV2009 zusammen. ich schau morgen mal nach den Properties. Waren nicht viele.
8. November 2019 11:54
Hallo
/codebase sollte das doch lösen?
- Code:
RegAsm.exe "D:\joshua\Workspace\dotNetLibaries\PDFBase64Converter\bin\Release\PDFBase64Converter.dll" /tlb:"D:\joshua\Workspace\dotNetLibaries\PDFBase64Converter\bin\Release\PDFBase64Converter.tlb"
- Code:
RegAsm.exe "D:\joshua\Workspace\dotNetLibaries\PDFBase64Converter\bin\Release\PDFBase64Converter.dll" /tlb:"D:\joshua\Workspace\dotNetLibaries\PDFBase64Converter\bin\Release\PDFBase64Converter.tlb" [b]/codebase[/b]
17. Dezember 2019 13:34
Moin @Joshua,
Schau bei den Automations in Navision doch bitte nach dem Text, den du in den Projekteigenschaften unter "Description" (also "Library for converting PDF to Base64") eingegeben hast. Dieses Feld scheint in den "Automation Server List" von Navision angezeigt zu werden (zumindest in meinem letzten Test, der gerade 3 Stunden her ist).
Kannst du darüber deine Assembly finden?
17. Dezember 2019 13:48
DaMu-DevX hat geschrieben:Moin @Joshua,
Schau bei den Automations in Navision doch bitte nach dem Text, den du in den Projekteigenschaften unter "Description" (also "Library for converting PDF to Base64") eingegeben hast. Dieses Feld scheint in den "Automation Server List" von Navision angezeigt zu werden (zumindest in meinem letzten Test, der gerade 3 Stunden her ist).
Kannst du darüber deine Assembly finden?
Herzlichen Dank, genau daran hats gelegen! Ich hatte das selbst mittlerweile dann festgestellt aber vergessen hier die Antwort zu posten. Ich habe in der Automation List immer nach dem Namen und nicht nach der Descirption gesucht. Als ich dann die GUID eingegeben habe in die Variable wurde mir dann die DLL angezeigt aber eben mit dem Text der Description.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.