Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
In Applikation alternativ 32-bit oder 64-bit DLL verwenden
oehrle
myCSharp.de - Member



Dabei seit:
Beiträge: 410
Herkunft: Germany

Themenstarter:

In Applikation alternativ 32-bit oder 64-bit DLL verwenden

beantworten | zitieren | melden


Hallo Community, sorry, bestimmt gibt es dazu schon einen Eintrag im Forum, habe aber mit der Suche keine Treffer finden können.
Kann man eigentlich mit Jokerzeichen suchen lassen? Jetzt aber zum eigentlichen Thema.

Ich habe eine Applikation, die wurde um einen Dokumentenansicht erweitert. Und zwar wird da eine externes System angezapft, dass mir dann die Dokumente per Filetransfer liefert.

Nun ist es so das ich dazu eine DLL bekommen habe, die mit 32-Bit Architektur erstellt ist.
Meine Applikation war auf ANY-CPU eingestellt, das heißt ja das diese selbständig bei der Installation für 64- oder 32-Bitsystem entschieden wird.
Nun habe ich die Applikation komplett auf Zielplattform 32-Bit gestellt.

Nun habe ich den Eindruck, dass die Appliaktion nun öfters abschmiert, weil diese Appliaktion sehr viele Daten vom SQL-Server saugt, unsere CAD-Programmierer mit ihren Tools auch schon viel Arbeitsspeicher brauchen und so die Ressourcen knapp werden.

Dazu kommt, dass diese Appliaktion auch noch auf WINXP laufen soll, damit haben wir noch ausgerüstete Maschinen, auf denen die Applikation läuft (da halt mit 32-Bit, deshalb waren alle eingebundenen Projekte der Applikation mit Zielplattform AnyCPU eingestellt).

Diese ganze Applikation verteile ich per ClickOnce.

Nun meine Frage, gibt es eineMöglichkeit wie ich das steuern kann ob die DLL mit 32-Bit oder 64-Bit verwendet werden soll, und das ganze weiterhin als eine einzige Appliaktion mit ClickOnce zu verteilen?
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16216

beantworten | zitieren | melden

Zitat von oehrle
Meine Applikation war auf ANY-CPU eingestellt, das heißt ja das diese selbständig bei der Installation für 64- oder 32-Bitsystem entschieden wird.
Nein heisst es nicht.
Die Entscheidung wird auf Prozess-Ebene getroffen, nicht bei der Installation.

Siehe meine Antwort vom 6. Juli in Softwareversion (aus Registry) wird im Release-Modus erkannt, im Debug-Modus nicht
Zitat von oehrle
Nun meine Frage, gibt es eineMöglichkeit wie ich das steuern kann ob die DLL mit 32-Bit oder 64-Bit verwendet werden soll, und das ganze weiterhin als eine einzige Appliaktion mit ClickOnce zu verteilen?
Du selbst kannst Das nur über die Compiler Optionen steuern (siehe auch Doku).
Im Prozess kannst Du das selbst nicht mehr ändern, weil zu diesem Zeitpunkt der Prozess schon geladen wurde.

Zumindest früher gab es Tools Exe-Dateien nachträglich entsprechend zu patche (CorFlags); aber zur Laufzeit geht das nicht (gilt aber IIRC nur für .NET Framework Dateien!).
Auch war es zumindest bei .NET Framework Anwendung möglich die jeweilige Anwendung über eine x64 bzw x86 Konsolen-Instanz zu starten, um eine AnyCPU-Anwendung mit der jeweiligen Bitness zu forcen.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7578
Herkunft: Waidring

beantworten | zitieren | melden

Hallo oehrle,
Zitat
das ich dazu eine DLL bekommen habe, die mit 32-Bit Architektur erstellt ist
Eine .NET DLL od. eine native DLL?
Zitat
Nun habe ich den Eindruck, dass die Appliaktion nun öfters abschmiert, ... viel Arbeitsspeicher
Hast du dazu eine Fehlermeldung od. einen Eintrag in der Windows-Ereignisanzeige?
32bit Anwendungen / Prozesse können auf weniger Arbeitsspeicher (korrekter: virtuellen Speicher) zugreifen als 64bit Prozesse, aber ich glaube eher nicht dass dies das Problem ist. Falls doch solltest du OutOfMemoryExceptions sehen -- die aber nicht zwangsläufig mit zu wenig Speicher zu tun haben müssen (sondern ein paar andere Gründe haben können wie hauptsächlich dass der GC keinen Platz findet um das Objekt der gewünschten Größe zu alloziieren).

mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
jogibear9988
myCSharp.de - Member



Dabei seit:
Beiträge: 589
Herkunft: Offenau

beantworten | zitieren | melden

Ich habs damals so gemacht: https://github.com/dotnetprojects/DotNetSiemensPLCToolBoxLibrary/blob/321dbe242911892a3dde3db2d9a7c482f468737a/LibNoDaveConnectionLibrary/Communication/LibNoDave/libnodave.net.cs#L185
cSharp Projekte : https://github.com/jogibear9988
private Nachricht | Beiträge des Benutzers
oehrle
myCSharp.de - Member



Dabei seit:
Beiträge: 410
Herkunft: Germany

Themenstarter:

beantworten | zitieren | melden

Hallo Abt, danke für die Info. Der Beitrag liegt schon etwas zurück, aber habe mich erst heute damit beschäftigt.
Also, wenn ich das richtig verstehe, dann muss ich die Applikation jeweils wür 32-Bit-Systeme und für 64-Bit-Systeme erstellen.
Die Anwender müssen dann entscheiden, was sie installieren (je nach Windows-Version, bei uns gibt es noch XP ;-)

In der Applikation kann ich nicht entscheiden, welche DLL geladen werden soll? Sonst könnte man ja bestimmt die Architektur abfragen?

Ja, gfoidl meint ja das etwas mit dem GC nicht stimmt. OutofMemory-Ex ist schon aufgetreten. Ich denke da wo das hauptsächlich passiert, die nutzen noch eine andere RAM-lüsterne Applikation da diese auch Simulationen durchführt, und diese ist als 32-Bit aktiv.
Wie kann ich das nachsehen, im Taskmanager, sehen was sich die Appliaktionen an RAM greifen?
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16216

beantworten | zitieren | melden

Zitat von oehrle
Also, wenn ich das richtig verstehe, dann muss ich die Applikation jeweils wür 32-Bit-Systeme und für 64-Bit-Systeme erstellen.
Jo, wie das seit vielen vielen Jahren bei vielen vielen Anwendungen der Standard-Fall ist und nach und nach nur noch 64 Bit Anwendungen gibt.
Zitat von oehrle
In der Applikation kann ich nicht entscheiden, welche DLL geladen werden soll? Sonst könnte man ja bestimmt die Architektur abfragen?
Siehe oben: Nein, nicht mehr wenn die Anwendung schon gestartet ist.
Zitat von oehrle
Wie kann ich das nachsehen, im Taskmanager, sehen was sich die Appliaktionen an RAM greifen?
Einfach Task Manager öffnen und die RAM-Reservierungen anschauen...?
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
oehrle
myCSharp.de - Member



Dabei seit:
Beiträge: 410
Herkunft: Germany

Themenstarter:

beantworten | zitieren | melden

Hallo, habe gerade an dem Projekt nochmal getestet.
Was dazu sagen kann: Bei manchen Arbeitsplätzen läuft noch eine Software mit Simulation, die ist auch als 32-Bit installiert, die braucht auch heftig RAM. Bei diesen Arbeitsplätzen passiert auch der Absturz, da ist der RAM auch sehr ausgenutzt (haben 16 GB RAM, aber 32-Bit kann das ja nicht nutzen). Wenn nun beide Applikationnen sehr RAM-durstig sind, dann kämpfen die um die gleichen Speicherzellen bis 4.2 GB, oder? Darüber kommen die Anwendungen ja nicht ran, wegen 32-Bitgrenze.

Dann noch eine andere Frage: Wenn ich eine Applikation habe die aus mehren Projekten zusammen besteht, und die Hauptapplikation (Startprojekt) wird mit Target "x64" eingestellt, dann müssen ja alle anderen Projekte in der Applikation auch auf "x64" eingestellt sein, korrekt ?? Ist ein Projekt auf "x32", dann funktioniert die Applikation nicht, korrekt?

Folgende Überlegung: Meine Applikation besteht aus 10 Projekten. 8 Projekte sind relativ keline brauchen wenig RAM, zwei Projekte können aber schon relativ viel Speicher brauchen.
Wäre es möglich, das ich diese beiden speicherhungrigen Projekte als EXE erstelle und dann von meiner Applikation aben starte? Dann könnte diese als 64-Bit laufen, alles andere bleibt wie gehabt ?? Und das hätte den Vorteil, das ich dann von WinXP diese zwei speicherhungringen Projekte auch als 32-Bit aufrufen könnte, und das somit auf WinXP noch läuft (Anmerkung: auf den WinXP-rechner läuft keine andere Ramdurstige Anwendung).

Wäre das ein Weg?
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16216

beantworten | zitieren | melden

Zitat von oehrle
Wenn nun beide Applikationnen sehr RAM-durstig sind, dann kämpfen die um die gleichen Speicherzellen bis 4.2 GB, oder? Darüber kommen die Anwendungen ja nicht ran, wegen 32-Bitgrenze.
Ne, so funktioniert die RAM-Verwaltung nicht.
Das Betriebssystem kann prinzipiell den Applikationen mehr RAM zur Verfügung stellen als das system physikalisch hat, zB durch Auslagerungsdateien.
Auch wird Dein Prozess niemals auf Speicherzellen-Basis agieren. Aber Dein Prozess kann nicht mehr Speicher allokieren als die Bitness zulässt. Völlig wurst wie Dein System aussieht.
Wenn Du es verstehen willst, dann musst die Grundlagen von Betriebssystemen verstehen, also Handles, Thread, Processes, Memory Management etc.

Sollen Deine Anwendung mehr Speicher nutzen können dann kommst Du niemals um x64 rum.
Zitat von oehrle
dann müssen ja alle anderen Projekte in der Applikation auch auf "x64" eingestellt sein, korrekt ?? Ist ein Projekt auf "x32", dann funktioniert die Applikation nicht, korrekt?Wäre das ein Weg?
Das steht alles in dem Link, der Dir gegeben wurde: die Bitness muss immer übereinstimmen.
Any CPU hat man nur der .NET Runtime zu verdanken, die dem Entwickler hier viel abnimmt; und eben der WOW64 Emulation von Windows.
Gäbe es das nicht, dann müsste der Entwickler hier viel mehr Eigenorganisation ins Spiel bringen.
Zitat von oehrle
Wäre es möglich, das ich diese beiden speicherhungrigen Projekte als EXE erstelle und dann von meiner Applikation aben starte?
Probiers doch einfach aus?

Möglich ist alles, immer nur eine Frage des Aufwands.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
oehrle
myCSharp.de - Member



Dabei seit:
Beiträge: 410
Herkunft: Germany

Themenstarter:

EXE als X86 erstellen und bei anderer Platform verweden

beantworten | zitieren | melden

Hallo Abt, ist schon wieder ein bischen her, aber habe aus dem einen Projekt eine EXE erstellt, mit Übergabeargumenten versehen (bei Programmstart zur Steuerung).
Das funktioniert, kann diese dann aus einerHaptanwendung die z.B. mit "Any CPU" kinfiguriert ist aufrufen und laufen lassen.
Verwende dich die DLL der Applikation, dann geht das nicht (eine SAP-DLL ist wohl nur für X86 ausgelegt, die bekomme ich nicht anders her).

Also würde das mit der EXE soweit funktionieren. Diese rufe ich dann mit "Process.Start" in meiner Applikation auf.

Dazu hätte ich noch einer Frage: Gibt es eine Möglichkeit, bei "Process.Start" einen Rückgabewert aus der aufgerufenen EXE auszuwerten, um dann in der Haupapplikation zu entscheiden, ob die EXE-Ausführung das was sie machen soll auch machen konnte.

Die EXE ruft Daten aus einer Applikation ab. Mißlint dies, gibt die Anwendung "FALSE" zurück. Kann ich die in "Process.Start" auswerten? Da gibt es etwas, aber scheint aber nicht genau das zu tun.

Ich weiss, das ist nicht der korrekte Weg, aber ich muss mit da jetzt erst mal so behelfen.
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1919
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

Process.Start liefert dir die Process Instanz.
Diese wiederrum liefert dir im ExitCode den Wert welchen Main zurückgibt.

Dort kannst du dann einen entsprechenden int Wert aus deiner Anwendung liefern lassen und entsprechend auswerten.
Dazu muss die Main Methode einfach einen int zurück liefern, der dann den entsprechenden Status liefert.

Info:
Process.ExitCode Eigenschaft (System.Diagnostics)

Nachtrag:
Ich verstehe nur nicht was du mit deiner DLL an der Stelle hast.
Ich habe auch eine DLL für SAP in einer Anwendung.
Diese muss dann aber explizit für die jeweilige Variante(32/64 Bit) erstellt werden.
Hier ist mir dann aber nicht klar in welcher Verbindung dies zu deinem Process.Start Problem steht.

T-Virus
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von T-Virus am .
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
oehrle
myCSharp.de - Member



Dabei seit:
Beiträge: 410
Herkunft: Germany

Themenstarter:

beantworten | zitieren | melden

Danke für T-Virus für die Antwort.
Das mit der DLL hat mti SAP zu tun, das habe ich von einem externen Kollegen bekommen, darinsind Anmeldemethodik und Abfragemethodik enthalten. Da ist eine mit X86 wohl erstellt, die aber dann in meiner Hauptanwendung (wenn diese auf "Any CPU" eingestellt ist) nicht läuft. Ist die Hauptanwendung mit "X86" eingestellt, dann kein Problem.
Das war das Problem zu der DLL.
Erstellt ist alles in FW 4.0.
Attachments
private Nachricht | Beiträge des Benutzers
oehrle
myCSharp.de - Member



Dabei seit:
Beiträge: 410
Herkunft: Germany

Themenstarter:

beantworten | zitieren | melden

Hallo, so ich nun wieder.
Habe mit den DLL's nochmal rumgespielt und auch die neue von SAP gezogen. Leider keine Veränderung.

Nun habe ich aber noch ein Projekt, das in einer anderen Appliaktion verwendet wird. Da ist folgendes zugange:
Für das Projekt hatte ich nur Basis-DLL's die in VB eingebunden werden konnten. Also, was habe ich gemacht, ein VB-Projekt, habe meien Grundmethoden in VB programmiert, und verwende das ganze nun in einem C#-Projekt.

Das VB-Projekt war bisher immer mit x86 eingestellt, das C#-Hauptprojekt (Hauptapplikation) auch. Jetzt habe ich die C#-Hauptapplikation auf AnyCPU gestellt, dann bekomme ich die Meldung:
"An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)"

Stelle ich das VB-Projekt auf AnyCPU kommt das auch.
Wo leigt nun das Problem? Müssen die Basis-DLL's vom VB-Projekt eine bestimmte Konfiguration haben, wenn ja wie kriege ich das raus?

Oder könnte es sein, weil ich Mehthoden im VB-Projekt mit Interger-Rückgabewerten versehen habe die mit der Typisierung "Int32" definiert sind?
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16216

beantworten | zitieren | melden

Zitat von oehrle
Jetzt habe ich die C#-Hauptapplikation auf AnyCPU gestellt, dann bekomme ich die Meldung:
"An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)"

Stelle ich das VB-Projekt auf AnyCPU kommt das auch.
Hast Du meine Antwort gelesen, was AnyCPIU bedeutet? Das erklärt auch Dein anderes Problem bereits.
Wenn Du konkrete Bitness supporten musst, zB wegen externen Abhängigkeiten oder referenzierten DLLs, dann arbeite auch mit konkreten Bitness Angaben und nicht mit AnyCPU.

Und ja: die müssen alle komplett zusammen passen - auch mit der Umgebung.
Wenn Du DLLs in eine andere Anwendung einbinden musst, dann musst Du diese auch mit der korrekten Bitness zur Verfügung stellen.
Die meisten Anwendungen haben sauber dokumentiert, was möglich / nötig ist.
[/quote]
Zumindest in .NET sind die Typen durch Compiler/Runtime Features nicht an die Bitness gekoppelt.
Daher: Nein.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
oehrle
myCSharp.de - Member



Dabei seit:
Beiträge: 410
Herkunft: Germany

Themenstarter:

beantworten | zitieren | melden

Hallo Abt.
Gibt es eventuell eine Möglichkeit, das gesamte Projekt aus einem Guss zu machen, aber einfach die DLL's dann über die Einstellung von Platform zu steuern? Gibt es da die Möglichkeit, in der *.csprj über die Platform die betreffende DLL zu verwenden?
Falls das möglcih wäre, funktioniert aber die Installation mit ClickOnce auch noch?

Hintergrund der Frage. Ich hätte somit den geringeren Aufwand und muss nicht 2 Projekte pflegen.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16216

beantworten | zitieren | melden

Ich hab etwas das Gefühl (was täuschen mag) Du gehst unstrukturiert an die Sache ran oder unwillig die Doku zu lesen, auf die Du nun mehrfach hingewiesen wurdest.
Du wirst nicht drum rum kommen Dich mit dem Thema beschäftigen. Les die Dokumentation.
Zitat
Ich hätte somit den geringeren Aufwand und muss nicht 2 Projekte pflegen.
Musst Du auch nicht, wenn Du es richtig machst und nicht Basteln versuchst Workarounds zu erfinden.
Verwende in Deiner Projektdatei entsprechende Conditions für Abhängigkeiten in der Plattform.

Das ist alles vollständig dokumentiert.
Gemeinsame MSBuild-Projekteigenschaften - MSBuild
Du findest hunderte Beispiele, Empfehlungen und Hintergrunde mit einer einfachen Google Suche dazu: Google Suche nach "csproj multi platform"
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
oehrle
myCSharp.de - Member



Dabei seit:
Beiträge: 410
Herkunft: Germany

Themenstarter:

beantworten | zitieren | melden

Hallo Abt. Habe mir gestern für das Problem beinahe den ganzen Tag Zeit genommen und mal nachrecherchiert.
Also, ich finde das passende zu finden ist erst mal nicht so einfach, da meistens auch die beschriebenen Dinge englisch verfasst sind. Zudem binich auch nicht der abdolute Informatiker, und bei MS findet man zu diesem Problem auch nicht gerade so viele Beschreibungen.
Also, ich habe mich dann ma an folgenden Link gehalten:
conditionally-use-32-64-bit-reference-when-building-in-visual-studio
Dann habe ich von der Applikation die aus mehreren Projekten besteht, erst mal eines genommen, wo es die DLL's für 32-Bit und 64-Bit gibt. Dieses Projekt handelt die SAP-Anbindung für Zeichnungsbetrachtung ab, die ich für 32-Bit Systeme (WINXP die haben wir noch) und auch 64-Bit Syteme benötige. Der Code der Appliaktion bleibt ja für beide Zustände gleich (ob 32 - oder 64-Bit).
Dann habe ich die beiden DLL's mal versucht einzubinden. Die 64-Bit-Varinate schien zu laufen, aber als ich auf die 32-Bit-Variante zurückgeschalten hab, funktionierte die nicht.
Eingebunden habe ich die folgendermaßen:


<ItemGroup>
    <Reference Include="PresentationCore" />
    <Reference Include="PresentationFramework" />
    <Reference Include="sapnco, Version=3.0.0.42, Culture=neutral, PublicKeyToken=50436dca5c7f7d23, processorArchitecture=x64">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\..\..\DLLS\SapZeichnungen\x64\sapnco.dll</HintPath>
      <Private>True</Private>
    </Reference>
	   <Reference Include="sapnco, Version=3.0.0.42, Culture=neutral, PublicKeyToken=50436dca5c7f7d23, processorArchitecture=x86">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\..\..\DLLS\SapZeichnungen\x86\sapnco.dll</HintPath>
      <Private>True</Private>
    </Reference>
    <Reference Include="sapnco_utils, Version=3.0.0.42, Culture=neutral, PublicKeyToken=50436dca5c7f7d23, processorArchitecture=x64">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\..\..\DLLS\SapZeichnungen\x64\sapnco_utils.dll</HintPath>
      <Private>True</Private>
    </Reference>
	 <Reference Include="sapnco_utils, Version=3.0.0.42, Culture=neutral, PublicKeyToken=50436dca5c7f7d23, processorArchitecture=x86">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\..\..\DLLS\SapZeichnungen\x86\sapnco_utils.dll</HintPath>
      <Private>True</Private>
    </Reference>

Kann es sein, das hier die "processorArchitecture=x64" falsch ist, und MSIL stehen sollte?

Zudem finde ich verwirrend, wie die genaue Einstellung gemachtr wird, das einmal die "32-Bit" oder "64-Bit" - Erstellung angestoßen wird.
Habe mal noch ein Bild dazugehängt.
Attachments
Gestern, private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7578
Herkunft: Waidring

beantworten | zitieren | melden

Hallo oehrle,

ich hab in diesem Thread den Faden (;-)) verloren. Kannst du bitte zusammenfassen was hier das Problem ist od. trifft es das:
  • SAP-DLL mit 32bit und 64bit vorhanden
  • .NET Framework 4
  • soll im Idealfall zur Laufzeit die passende native DLL laden und funktionieren
?

Das geht natürlich, aber bitte um Rückmeldung dann kann ich dir ein Demo basteln.

mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Gestern, private Nachricht | Beiträge des Benutzers
oehrle
myCSharp.de - Member



Dabei seit:
Beiträge: 410
Herkunft: Germany

Themenstarter:

beantworten | zitieren | melden

Hallo gfoidl, genau um das geht es.
Wie mache ich das Projekt auf x86 und x64 lauffähig, wenn es die einzubindenden DLL's als 32- und 64-Bit gibt. Applikation soll auf 32- und 64Bit Betriebsystem laufen, ohne zwei Projekt fahren zu müssen.
Danke.
Gestern, private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7578
Herkunft: Waidring

beantworten | zitieren | melden

Hallo oehrle,

ich mach ein wenig später dazu ein Demo, dann siehst du wie es möglich ist.

mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Gestern, private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7578
Herkunft: Waidring

beantworten | zitieren | melden

Hallo oehrle,

mir ist gerade 32bit/64bit unmanaged DLL "importen" - wie? wieder eingefallen.
Wenn du also die nativen DLLs ins entsprechende Unterverzeichnis kopierst, so kannst du vie den dort beschriebenen Weg das einfac per [DllImport] (P/Invoke) einbinden.
Ist wohl der einfachste Weg ohne Win-API Hilfen od. (ab .NET Core 3.1 via NativeLibrary).

Probier das einmal aus (dann brauch ich kein Demo basteln ;-)).

mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Gestern, private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4192

beantworten | zitieren | melden

Hallo gfoidl,

bei den beiden DLLs handelt es sich aber um .NET-Assemblies (keine nativen): SAP Connector for Microsoft .NET 3.0
(sonst könnten sie ja auch nicht als Verweis zum Projekt hinzugefügt werden)

Wichtig scheint nur zu sein, daß man die "Microsoft C++ Runtime DLLs version 10.0" in der passenden Version (x86, x64) installiert hat.
Gestern, private Nachricht | Beiträge des Benutzers
oehrle
myCSharp.de - Member



Dabei seit:
Beiträge: 410
Herkunft: Germany

Themenstarter:

beantworten | zitieren | melden

Hui, das hört sich ja fast noch komplizierter an als das in der CSPROJ-Datei einzutüteln ...
Ist das wirklich einfacher? das habe ich so noch nie gemacht (P/Invoke).
Bleibt im Code auch alles gleich bei beiden Vesionen (x86 oder x64, aber du sagtest ja "AnyCPU" verwenden). Wie rufe ich dann von den DLL's die Methoden auf?
Und wie mache ich das, wenn das Projekt mit ClickOnce veröffentlicht wird. Muss ich dann alle DLL's mit den diversen Bittigkeiten in das Projekt verlinken oder zufügen ?

Dann noch eine Frage. Habe ein Bild von einem der beien DLL-typen gemacht (x86/x64). Wenn ich das richtig verstehe, dann ist das managed DLL, korrekt?
Das heißt dann, das müßte ohen das ganze von oben beschrieben funktionieren?
Attachments
Gestern, private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7578
Herkunft: Waidring

beantworten | zitieren | melden

Hallo oehrle,

ich kenn mich nicht mehr aus, jetzt wieder alles anders als bei meiner Nachfrage oben. Du machst das Helfen nicht unbedingt leicher... ;-)

Auch wenn es hier wohl nicht mehr passt, hab ich ein Demo für native Dlls erstellt --> 32bit/64bit unmanaged DLL "importen" - wie?


Hallo Th69,
Zitat
bei den beiden DLLs handelt es sich aber um .NET-Assemblies (keine nativen): SAP Connector for Microsoft .NET 3.0
ah, das sind dann wohl C++/CLI Dlls. Gut zu wissen.

mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Gestern, private Nachricht | Beiträge des Benutzers
oehrle
myCSharp.de - Member



Dabei seit:
Beiträge: 410
Herkunft: Germany

Themenstarter:

beantworten | zitieren | melden

Hallo gfoidl, habe mir das geerade runtergeladen und angesehen.
Die beiden DLL's sind ja managed, aber wie du sagst wohl in C++. Das heißt ic nehme die "NetFull"-Variante (hbe FW 4.0 in Verwendung), oder egal, das unterstützt noch alle Frameworks, korrekt?
Ich binde die beiden DLL's ein und mache in der App.xamls.cs die Auswertung auf 32- oder 64-Bit, dazu wir dann die statische Klasse "NativLib" aufgerufen.
In der Klasse definiere ich die DLL doer mehrere DLL's mit der/den Variablennamen denen ich DLL-Namen zuweise.

Wenn ich mehrere DLL's habe, muss ich noch jede DLL anlegen oder wie nennt man das:
==> [DllImport(LibName, EntryPoint = "getBitnessMessage")]

Korrekt?

Ansonsten muss ich im Code nichts machen, alles bleibt wie es war?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von oehrle am Heute, .
Heute, private Nachricht | Beiträge des Benutzers