com_module_sample

Deutschsprachiges X#-Forum – German language forum

Moderator: wriedmann

User avatar
wriedmann
Posts: 3655
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

com_module_sample

Post by wriedmann »

Hallo Franz,
1) Du musst die ComTestFR.dll ins Verzeichnis kopieren, wo die Exe erstellt wird.
2) die Klasse IComTester habe ich einfach vergessen zu entfernen, dasselbe gilt fürs Manifest.
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
lagraf
Posts: 420
Joined: Thu Jan 18, 2018 9:03 am

com_module_sample

Post by lagraf »

Das habe ich auch gemacht, alles 1:1 hinein entpackt, sogar den gleichen Ordner c:tempcomtest verwendet, damit ich nichts verändern muß! Trotzdem startet die App nicht.
Bild1.jpg
Bild1.jpg (101.1 KiB) Viewed 267 times
User avatar
wriedmann
Posts: 3655
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

com_module_sample

Post by wriedmann »

Hallo Franz,
sorry, da gehört aus dem Manifest der Exe der Verweis auf die ComTestF.DLL raus:

Code: Select all

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="X86"
    name="VO.Application"
    type="win32"
/>
<description>Visual Objects Application.</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
	<dependency>
  	<dependentAssembly>
  		<assemblyIdentity
  			type="win32"
  			name="COMTestFR"
  			version="1.0.0.0"
  			publicKeyToken="0359fa75d6c66754"
  			>
  		</assemblyIdentity>
  	</dependentAssembly>
  </dependency>
</assembly>
Mit Nachschauen im EventViewer hättest Du das auch alleine rausfinden können, oder mit der angeführten sxslog.cmd:

Code: Select all

sxstrace Trace -logfile:systrace.out
sxstrace Parse -logfile:systrace.out -outfile:sxstrace.txt
notepad sxstrace.txt
Die ist bei Problemen mit SideBySide immer der erste Schritt.
Nach dem Ändern des Manifests (ComTestFApp.man) und folgendem kompletten Recompilieren der Applikation ( Application - Rebuild all ) funktioniert es auch in einem separaten Verzeichnis:
ComTestFR.png
ComTestFR.png (15.64 KiB) Viewed 267 times
in dem nur Exe und Dll sind.
Das ist ja das eigentliche Coole an SideBySide, dass es keine Pfadabhängigkeiten gibt, sondern alles aus dem Applikations-Verzeichins geladen wird.
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
lagraf
Posts: 420
Joined: Thu Jan 18, 2018 9:03 am

com_module_sample

Post by lagraf »

Hallo Wolfgang,
- den Block für ComTestF habe ich aus dem Manifest entfernt
- den Block für IComTester habe ich aus der VO App entfernt
- hab auch die X# DLL neu generiert

Neu generieren der VO App hat nichts geholfen, erst beim Rebuild All ist die App dann gestartet!
Finden die Änderungen auch Einzug in das Beispiel bei der XSharp Doku?
Jedenfalls Danke für deine Hilfe!

Frage: Wenn ich nun weitere Methoden der COM Dll hinzufüge, genügt dann ein compilieren der Dll oder muß woanders auch noch was geändert werden?

PS: sxstrace kannte ich bisher noch gar nicht, hab ich ausprobiert, bringt aber einen "Unbekannten Fehler" beim Befehl "sxstrace Trace -logfile:systrace.out". Welche sxslog.cmd, hab ich da was überlesen?
User avatar
wriedmann
Posts: 3655
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

com_module_sample

Post by wriedmann »

Hallo Franz.,
wenn Du nur die Applikation neu generierst, kompiliert VO die Ressourcen nicht neu, daher steht in der Applikation auch noch das alte Manifest drin.
Das ist mir nicht aufgefallen, weil ich die ComTestF.dll auch noch in meinem Verzeichnis drin hatte.
Die Doku werde ich auf jeden Fall anpassen.
Leider ist Windows bei SxS sehr heikel, aber wenn das mal läuft, dann läuft das sehr stabil. Mittlerweile hat fast jede meiner VO-Applikationen mindestens eine X# COM-DLL dabei, weil es gar nicht mehr anders geht.
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
lagraf
Posts: 420
Joined: Thu Jan 18, 2018 9:03 am

com_module_sample

Post by lagraf »

Hallo Wolfgang,
ich habe meine X# DLL inzwischen fertig und auch mit einer von VO auf X# umgestellten Kassenapp ausgetestet. Wenn ich jetzt eine com enabled DLL daraus mache, um auch mit VO drauf zugreifen zu können, kann ich dann mit X# auch noch direkt (ohne Umweg über COM) auf die Methoden zugreifen oder brauche ich für X# und VO jeweils eine eigene DLL?
User avatar
wriedmann
Posts: 3655
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

com_module_sample

Post by wriedmann »

Hallo Franz,
klar kannst Du dafür eine einzige DLL verwenden - mache ich selber auch mehrfach, und gerade in einer Umstellungsfase auf X# wird das sogar sehr wichtig.
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
lagraf
Posts: 420
Joined: Thu Jan 18, 2018 9:03 am

com_module_sample

Post by lagraf »

Hallo Wolfgang,
meine DLL ist etwas komplexer als das com_module_sample. Ich habe eine Hauptklasse mit 11 public Methoden, die von VO angesprochen werden sollen. Ausserdem mehrere andere Klassen mit 69 Methoden, die von der Hauptklasse verwendet werden, aber nicht von VO direkt. Der Programmteil ist wie folgt aufgebaut:

Code: Select all

USING System.Runtime.InteropServices
...
BEGIN NAMESPACE RKSVComComplete

[ComVisible(TRUE)];
[Guid("***Guid1***")];
[ClassInterface(ClassInterfaceType.None)];
[ProgId("RKSVComComplete.RKSVCom")];
PUBLIC CLASS RKSVCom IMPLEMENTS IRKSVCom
   PUBLIC METHOD GetReadersCount() AS LONG
   PUBLIC METHOD GetCardReaders() AS STRING[]
...
END CLASS

PUBLIC CLASS xyz
   PUBLIC METHOD abc
   PUBLIC METHOD def
...
END CLASS
...
END NAMESPACE
Der Interfaceteil:

Code: Select all

USING System.Runtime.InteropServices

BEGIN NAMESPACE RKSVComComplete

[ComVisible(TRUE)];
[Guid(""***Guid2***)];
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)];
INTERFACE IRKSVCom
   [DispId(1)];
   PUBLIC METHOD GetReadersCount() AS LONG

   [DispId(2)];
   PUBLIC METHOD GetCardReaders() AS STRING[]

   ...
END INTERFACE
END NAMESPACE
Für die internen Klassen und Methoden habe ich keine Einträge im Interface angelegt.
Bis vor den Punkt Manifest erstellen funktioniert alles.
Beim Erstellen des Manifestes bekomme ich jede Menge Warnings für alle internen Klassen, die nicht von VO direkt genutzt werden:
G81010014: Explicit guid not defined

Im Manifest scheinen auch alle internen Klassen auf mit unbekannten Guids. Müssen diese Einträge entfernt werden? Habe ich etwas falsch definiert?
User avatar
robert
Posts: 4269
Joined: Fri Aug 21, 2015 10:57 am
Location: Netherlands

com_module_sample

Post by robert »

Franz,

If you add

[ComVisible(FALSE)];

to the classes that you do not want to be included in the COM DLL then it should work.
Also make sure that you do not have public properties or methods in the classes that you are making visible through that use these types as parameter or return value.

Robert
XSharp Development Team
The Netherlands
robert@xsharp.eu
lagraf
Posts: 420
Joined: Thu Jan 18, 2018 9:03 am

com_module_sample

Post by lagraf »

Hi Robert,
as you said
  • I prefixed all non visible classes with [ComVisible(FALSE)];
  • I deleted PUBLIC at all visible methods
For testing purposes I have a small X# app which calls these methods directly without COM to see if my DLL works. Using my DLL without COM stuff it does well, but since I added COM stuff I get exceptions with following message for 3 extern libs (Gma.QrCodeNet.Encoiding.dll, jose-jwt.dll and pcsc.sharp.dll) which I use in my DLL:

Code: Select all

System.IO.FileLoadException: Could not load file or assembly 'pcsc-sharp, Version=3.2.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. A strongly-named assembly is required. (Exception from HRESULT: 0x80131044) File name: 'pcsc-sharp, Version=3.2.0.0, Culture=neutral, PublicKeyToken=null' at RKSV.Light.APDU.APDUMaster.GetReaders(String[]& readers)
at RKSVComCompleteX.RKSVCom.GetReadersReturned() in
C:XIDEProjectsTESTApplicationsRKSVComCompleteXPrgRKSVComComplete.prg:line 332
What I have to do enabling COM when I use foreign DLLs in my DLL?
Post Reply