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
Riched20.dll Kann nicht geladen werden (32/64bit Problem)
Pedro_15
myCSharp.de - Member



Dabei seit:
Beiträge: 375
Herkunft: In der Nähe von Berlin

Themenstarter:

Riched20.dll Kann nicht geladen werden (32/64bit Problem)

beantworten | zitieren | melden

Hallo,

ich habe ein sehr Merkwürdiges Verhalten zur Zeit nur auf einem Rechner.

Ich benutze das RichTextControll.

Dort bekomme ich beim Starten folgende Fehlermeldung:
Die RichEd20.DLL-DLL kann nicht in den Arbeitsspeicher geladen werden.
Bei System.Windows.Form.RichTextBox.get_CreateParams()
....


Der Rechner ist mit einem 64Bit Windows 7 System ausgerüstet.
Ich kann aber nicht sagen, ob es an 64Bit liegt.

Hat jemand eine Idee!

Ich habe schon verschiedene riched20.dll probiert.

Vielen Dank für jede Hilfe!

Pedro
private Nachricht | Beiträge des Benutzers
Pedro_15
myCSharp.de - Member



Dabei seit:
Beiträge: 375
Herkunft: In der Nähe von Berlin

Themenstarter:

beantworten | zitieren | melden

Hallo,

wir haben den Fehler gefunden.

Es liegt doch an der riched20.dlll die es in zwei Versionen gibt eine für 32bit und eine für 64bit.

Wie kann ich es jetzt Handeln das die Richtige Version geladen wird?

Dank!

Pedro
private Nachricht | Beiträge des Benutzers
Timur Zanagar
myCSharp.de - Member

Avatar #avatar-3412.jpg


Dabei seit:
Beiträge: 1559

beantworten | zitieren | melden

Hallo Pedro_15,

In diesem Fall sollte die Anwendung in zwei Versionen vorliegen. Eine 32Bit und eine 64bit.
private Nachricht | Beiträge des Benutzers
TheBrainiac
myCSharp.de - Member

Avatar #avatar-3152.png


Dabei seit:
Beiträge: 832
Herkunft: /dev/null

beantworten | zitieren | melden

Wenn es sich um eine System.Windows.Forms.RichtextBox handelt, dann solltest du dich darum gar nicht kümmern müssen. Dann ist eher was mit deinem Windows schiefgelaufen...

Ob deine Anwendung nach 32 oder 64 Bit kompiliert ist, sollte keine Rolle spielen, er sollte automatisch die richtige Version der Windows-DLL nehmen.

Ich vermute eher, dass diese bei dir auf dem System korrupt sind. Kannst ja mal die Reparatur vom Windows-Setup laufen lassen.

Gruß, Christian.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von TheBrainiac am .
There are 10 types of people in the world:
Those, who think they understand the binary system
Those who don't even have heard about it
And those who understand "Every base is base 10"
private Nachricht | Beiträge des Benutzers
Pedro_15
myCSharp.de - Member



Dabei seit:
Beiträge: 375
Herkunft: In der Nähe von Berlin

Themenstarter:

beantworten | zitieren | melden

Ich liefer die riched20.dll mit, denn im Windows Verzeichnis ist ein alte dll mit der einige Dinge nicht gehen (Tabellen werden nicht richtig dargestellt).

Deswegen lade ich die DLL zur Laufzeit.

LoadLibrary(file);


[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        internal extern static IntPtr LoadLibrary(string libname);


Wie kann ich das am besten handeln?

Und wie bekomme ich raus, welche Vesion der DLL geladen ist?
Kann ich die Verionsnummer auslesen?
Danke!

Pedro
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Pedro_15 am .
private Nachricht | Beiträge des Benutzers
TheBrainiac
myCSharp.de - Member

Avatar #avatar-3152.png


Dabei seit:
Beiträge: 832
Herkunft: /dev/null

beantworten | zitieren | melden

Zitat von Pedro_15
Und wie bekomme ich raus, welche Vesion der DLL geladen ist?

Mittels folgendem Code bestimmst du, ob deine .Net-Dll als 32 oder 64 Bit ausgeführt wird:

public static bool Is64BitExecution {
    get {
        Assembly asm = Assembly.GetExecutingAssembly();
        Module mod = asm.GetModules()[0];
        PortableExecutableKinds k;
        ImageFileMachine m;
        mod.GetPEKind(out k, out m);
        return (k & PortableExecutableKinds.PE32Plus) == PortableExecutableKinds.PE32Plus ||
            ((k & PortableExecutableKinds.ILOnly) == PortableExecutableKinds.ILOnly && Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE").Contains("64"));
    }
}

Dem entsprechend kannst du dann die richtige Version der richedit20.dll laden.

Gruß, Christian.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von TheBrainiac am .
There are 10 types of people in the world:
Those, who think they understand the binary system
Those who don't even have heard about it
And those who understand "Every base is base 10"
private Nachricht | Beiträge des Benutzers
Pedro_15
myCSharp.de - Member



Dabei seit:
Beiträge: 375
Herkunft: In der Nähe von Berlin

Themenstarter:

beantworten | zitieren | melden

Hallo,

ich habe noch ein Problem damit.

Ich habe jetzt den Code:


if (!Is64BitExecution)
                {
                    string file = Application.StartupPath + "\\RICHED20.DLL";
                    
                    if (System.IO.File.Exists(file))
                    {

                        LoadLibrary(file);
                        version6 = true;
                        
                    }
                    
                }
                else
                {
                    string file = Application.StartupPath + "\\64Bit\\RICHED20.DLL";

                    if (System.IO.File.Exists(file))
                    {

                        LoadLibrary(file);
                        version6 = true;

                    }
                }

Das Programm läd die Dateien richtig (laut Debugger), aber bei dem 64Bit System kommt wieder die Fehlermeldung.

Kann es sein, dass das Programm die Datei die im Root Ordner liegt schon geladen hat und diese nimmt.

Was passiert, wenn schon die falsche DLL geladen wurde. Kann ich die DLL auch wieder entladen und die richtige DLL laden?

Ich hoffe, ich habe mich nicht zu unklar ausgedrückt.

Pedro
private Nachricht | Beiträge des Benutzers
winSharp93
myCSharp.de - Experte

Avatar #avatar-2918.png


Dabei seit:
Beiträge: 6155
Herkunft: Stuttgart

beantworten | zitieren | melden

Hallo Pedro_15,

ist deine Anwendung sehr speicherlastig?

Wenn nein: Kompiliere als x86 und lasse das mit dem Nachladen.
private Nachricht | Beiträge des Benutzers
Pedro_15
myCSharp.de - Member



Dabei seit:
Beiträge: 375
Herkunft: In der Nähe von Berlin

Themenstarter:

beantworten | zitieren | melden

Ja, das funktioniert auf jedenfall, aber schöner wäre es, wenn ich die richtige Version nachladen könnte.

Nur leider bekomme ich es nicht hin.


Assembly[] appAssemblies = AppDomain.CurrentDomain.GetAssemblies();

            for (int i = 0; i < appAssemblies.Length; i++)
                Console.WriteLine(
                    "{0}: {1}\n", i + 1, appAssemblies[i].FullName);

Komisch ist auch das nach dem Laden keine Assembly riched20 geladen ist.

Ich verstehe es irgendwie nicht.

Pedro
private Nachricht | Beiträge des Benutzers
TheBrainiac
myCSharp.de - Member

Avatar #avatar-3152.png


Dabei seit:
Beiträge: 832
Herkunft: /dev/null

beantworten | zitieren | melden

AppDomain.CurrentDomain.GetAssemblies() zeigt imho auch nur die geladenen .Net-Assemblies an und nicht native DLL's.

Ich nehme an, dass du mit DLLImport Methoden aus der DLL importierst. Diese wird geladen, sobald das erste mal so eine Methode aufgerufen wird. Wenn du also die Methoden noch nicht benutzt hast, ist die DLL auch noch nicht geladen.

Gruß, Christian.

P.S. Nochmal: sind die beiden Versionen der DLL auch wirklich in Ordnung? Oder ist evtl. doch eine davon korrupt?
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von TheBrainiac am .
There are 10 types of people in the world:
Those, who think they understand the binary system
Those who don't even have heard about it
And those who understand "Every base is base 10"
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5989
Herkunft: Leipzig

beantworten | zitieren | melden

Zitat von Pedro_15
Ich liefer die riched20.dll mit

Ich möchte mal bezweifeln, daß du das überhaupt darfst. Es gibt doch sicherlich auch eine Redistributable-Version der Komponente.
Weeks of programming can save you hours of planning
private Nachricht | Beiträge des Benutzers
Timur Zanagar
myCSharp.de - Member

Avatar #avatar-3412.jpg


Dabei seit:
Beiträge: 1559

beantworten | zitieren | melden

Was ich an der ganzen Geschichte nicht verstehe warum du die riched20.dll benutzen willst. Das es eine andere Version gibt hängt meiner Meinung nach auch damit zusammen welche Office Version installiert ist oder nicht installiert ist.

Was genau ist dein Problem mit der RichTextBox? Und auch MrSparkle zu zustimmen, glaube auch ich nicht das du die DLL einfach so mitliefern darfst.
private Nachricht | Beiträge des Benutzers
DickesB
myCSharp.de - Member



Dabei seit:
Beiträge: 68
Herkunft: Treis in Hessen

beantworten | zitieren | melden

Hallo Timur Zanagar,

das liegt bestimmt daran, dass die standard .net richtextbox bei komplexeren rtf-datein schon ziemlich schwächelt(z.b. bei verschachtelten tabellen).
stand auchmal vor dem problem und habe da auch eine neuere version der dll dem richtextbox-wrapper per LoadLibrary untergeschoben. das hat aber auch nur zur anzeige funktioniert und die richtextbox hat sich danach sehr komisch verhalten(z.B. waren TextLength und Text.Length danach immer verschieden und wenn man den SelectedIndex auf knapp unter diese werte gesetzt hat, gabs ne ArgumentOutOfrangeException)

die vorgehensweise is also alles andere als das wahre. bei mir war das allerdings auch nicht für einen kunden.

@Pedro_15: ich denke auch, dass du die dll auf keinen fall mitliefern darfst. könntest halt höchstens sicherstellen, dass überall office installiert ist, aber das ist sicherlich auch nicht sinn der sache...

MfG

DickesB
private Nachricht | Beiträge des Benutzers
Pedro_15
myCSharp.de - Member



Dabei seit:
Beiträge: 375
Herkunft: In der Nähe von Berlin

Themenstarter:

beantworten | zitieren | melden

Wie DickesB schon richtig geschrieben hat, liegt es an der schwäche der Standard Version der riched20.dll die in Windows system32 Ordner liegt (Version 3.1).

Wenn Office installiert wurde, gibt es noch eine Passende riched20.dll im "Common Files\microsoft shared\officexx" (z.B. bei Office2010 Version 6.0).

Ok ich kann auch die Datei laden, aber wie bekomme ich raus in welchem Ordner "officexx" die Datei liegt, denn bei jeder Office Version gibt es einen anderen Ordner.

Ich kann natürlich von Office14 bis Office10 alle Ordner durch gehen und schauen,
aber ist das schön?

Des Weiteren gibt es das Problem, wenn kein Office installiert ist, dann gibt es keinen Ordner mit einer neueren dll.

So habe ich mir gedacht, die Datei einfach mitzulieferen. Leider hat sich gerade ergeben, dass bei Office 2007 Installationen die mitgelieferte Datei von Office 2010 nicht funktioniert.

Also alles keine gute Lösung!

Hat jemand eine Idee?

Pedro
private Nachricht | Beiträge des Benutzers
Timur Zanagar
myCSharp.de - Member

Avatar #avatar-3412.jpg


Dabei seit:
Beiträge: 1559

beantworten | zitieren | melden

Hallo Pedro_15,

Eine Lösung für dein Problem habe ich zwar nicht parat, aber bevor du irgednwelche DLLs einfach so mitlieferst, solltest du dir das erstmal genehmigen lassen.
private Nachricht | Beiträge des Benutzers
Pedro_15
myCSharp.de - Member



Dabei seit:
Beiträge: 375
Herkunft: In der Nähe von Berlin

Themenstarter:

beantworten | zitieren | melden

Danke für den Hinweis, der mir leider nicht weiterhilft.

Ich möchte doch nur ein funktionierendes RTF Control. Leider ist das nicht mit dem Standard möglich.

Vielleicht hat ja jemand noch eine Lösung.

Pedro
private Nachricht | Beiträge des Benutzers