com_module_sample
Moderator: wriedmann
com_module_sample
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
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
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
com_module_sample
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.
com_module_sample
Hallo Franz,
sorry, da gehört aus dem Manifest der Exe der Verweis auf die ComTestF.DLL raus:
Mit Nachschauen im EventViewer hättest Du das auch alleine rausfinden können, oder mit der angeführten sxslog.cmd:
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: 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
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>
Code: Select all
sxstrace Trace -logfile:systrace.out
sxstrace Parse -logfile:systrace.out -outfile:sxstrace.txt
notepad sxstrace.txt
Nach dem Ändern des Manifests (ComTestFApp.man) und folgendem kompletten Recompilieren der Applikation ( Application - Rebuild all ) funktioniert es auch in einem separaten Verzeichnis: 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
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
com_module_sample
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?
- 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?
com_module_sample
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
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
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
com_module_sample
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?
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?
com_module_sample
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
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
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
com_module_sample
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:
Der Interfaceteil:
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?
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
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
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?
com_module_sample
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
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
The Netherlands
robert@xsharp.eu
com_module_sample
Hi Robert,
as you said
What I have to do enabling COM when I use foreign DLLs in my DLL?
as you said
- I prefixed all non visible classes with [ComVisible(FALSE)];
- I deleted PUBLIC at all visible methods
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