Laden...

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

Erstellt von Pedro_15 vor 13 Jahren Letzter Beitrag vor 13 Jahren 6.898 Views
P
Pedro_15 Themenstarter:in
375 Beiträge seit 2005
vor 13 Jahren
Riched20.dll Kann nicht geladen werden (32/64bit Problem)

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

P
Pedro_15 Themenstarter:in
375 Beiträge seit 2005
vor 13 Jahren

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

1.457 Beiträge seit 2004
vor 13 Jahren

Hallo Pedro_15,

In diesem Fall sollte die Anwendung in zwei Versionen vorliegen. Eine 32Bit und eine 64bit.

795 Beiträge seit 2006
vor 13 Jahren

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.

`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"`
P
Pedro_15 Themenstarter:in
375 Beiträge seit 2005
vor 13 Jahren

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

795 Beiträge seit 2006
vor 13 Jahren

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.

`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"`
P
Pedro_15 Themenstarter:in
375 Beiträge seit 2005
vor 13 Jahren

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

5.742 Beiträge seit 2007
vor 13 Jahren

Hallo Pedro_15,

ist deine Anwendung sehr speicherlastig?

Wenn nein: Kompiliere als x86 und lasse das mit dem Nachladen.

P
Pedro_15 Themenstarter:in
375 Beiträge seit 2005
vor 13 Jahren

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

795 Beiträge seit 2006
vor 13 Jahren

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?

`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"`
5.658 Beiträge seit 2006
vor 13 Jahren

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

1.457 Beiträge seit 2004
vor 13 Jahren

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.

D
68 Beiträge seit 2009
vor 13 Jahren

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

P
Pedro_15 Themenstarter:in
375 Beiträge seit 2005
vor 13 Jahren

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

1.457 Beiträge seit 2004
vor 13 Jahren

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.

P
Pedro_15 Themenstarter:in
375 Beiträge seit 2005
vor 13 Jahren

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