{title}

Hallo allerseits, letzte Nacht habe ich Windows XP auf meinem neuen Computer installiert. Während des Setups wurde mir mitgeteilt, dass mswsock.dll und framedyn.dll für das Setup nicht auf mein System kopiert werden konnten. Ich habe es erneut versucht, aber es hat immer noch nicht funktioniert, also habe ich auf "Ignorieren" geklickt. Der Computer funktionierte einwandfrei, aber jedes Mal, wenn ich hochfuhr, bekam ich einige Fehler, weil ich diese Dateien nicht hatte. Also ging ich ins Internet und lud sie herunter mswsock.dll und framedyn.dll und Dinge, die mswsock erforderten, fingen an zu funktionieren, aber als ich neu startete, dauerte es ewig, bis der Computer gestartet wurde und viele Apps (einschließlich explorer.exe) nicht mehr funktionierten. Wie kann ich das klären? Ich denke, es ist ein Problem mit mswsock.dll (ich habe es geschafft, framedyn.dll zu entfernen) zu tun, aber ich konnte es nicht löschen, weil es "in Verwendung" war und jetzt die Taskleiste, der Desktop usw. (alles) nicht angezeigt wird, damit ich " Versuchen Sie nicht erneut, mswsock.dll (im Ordner system32) zu löschen. Wie kann ich mswsock.dll löschen? Vielen Dank an alle! Dom

Versuchen Sie es zu löschen. Darf ich fragen, ob dies eine echte Windows-CD ist, keine Kopie oder gefälschte Version?

Dies liegt an einer verschmutzten CD oder einem verschmutzten CD-Laufwerk. Reinigen Sie die CD und versuchen Sie es mit einem anderen Laufwerk, um Ihren O.S.

Software mit Roots in GAC kann eine DLL im Pfad nicht erkennen.

Dies ist eine Art Abzweigung von einem präiven Thread. Hier ist das Szenario:

  • Ich habe eine Anwendung mit dem Namen string und alle ihre Bibliotheken befinden sich im GAC.
  • Ich schreibe eine Sammlung von Bibliotheken, die in diese Anwendung eingebunden sind.
  • Ich erstelle mehrere Assemblys, aber einige Interops. Diese sind alle stark benannt.
  • Ich installiere alle Baugruppen in den GAC. Wenn ich die Interops weglasse, sagt die Anwendung nicht, dass sie sie nicht finden können.
  • Ich installiere die Interops in den GAC. Sie müssen irgendwie ein Assembly-Manifest haben, das mit ihnen zusammenhängt, weil sie installiert werden. Jetzt funktioniert das Programm.
  • Ich schreibe eine einfache VB6 ActiveX-DLL (der Code ist unten gezeigt).
  • Ich registriere es mit regsvr32/sDLL.
  • Ich führe die Anwendung aus und sie schlägt fehl. Die neue DLL wurde nicht gefunden.
  • Ich kann es nicht zum GAC hinzufügen. Es wird erwartet, dass der Fehler ein Assemblymanifest enthält.
Ich bin nicht sicher, warum sich diese DLL von den anderen unterscheidet. Sie sind auch ältere C ++ 6- und VB6-DLLs. Hier ist der Code für meine einfache Klasse (basierend auf Gesprächen aus meinem vorherigen Beitrag mit BC_Programmer).
Code:
Öffentliche Funktion ComToBytes (objName als String, obj als Objekt) als Byte () PropBag als PropertyBag dimmen PropBag = Neue PropertyBag PropBag.WriteProperty objName, obj ComToBytes = PropBag.Contents End Function Öffentliche Funktion BytesToCOM (objName als String, obj () als Byte) As Object Dim PropBag As PropertyBag Set PropBag = New PropertyBag PropBag.Contents = obj Set ComFromBytes = PropBag.ReadProperty (objName) End FunctionHier gibt es Vorschläge, warum die Anwendung meine DLL nicht findet, egal wo sie sich befindet?

Sie haben die Kontrolle über die betreffende C # -Anwendung, richtig? Warum können Sie nicht über die IDE auf die COM-Bibliothek verweisen? Zumindest wird durch Hinzufügen eines Verweises auf eine COM-Komponente ein verwalteter Wrapper für die Komponente generiert. Ich glaube, dass Sie dies manuell mit tlbimp.exe tun können, das Teil des .NET-Framework-SDK ist. Grundsätzlich erhalten Sie den verwalteten Code, der die nicht verwaltete COM-Komponente verwendet. Der verwaltete Code kann im GAC installiert werden, aber Der nicht verwaltete Code kann nicht. Der von GAC installierte Wrapper greift jedoch auf diesen nicht verwalteten Code zu. Und es muss bleiben, wo immer es war, als es registriert wurde (über regsvr32). Sie benötigen einen verwalteten Wrapper für die COM-DLL.

Wenn Sie die Lösung oder Projekte für die aufrufende Anwendung meinen, nein, das tue ich nicht. Im Grunde genommen erstelle ich die ActiveX-DLL (VB6-Code) und verweise darauf aus dem .NET 2.0-C # -Projekt. Wenn ich das tue, wird die Interop erstellt Es kann jedoch nicht zum GAC hinzugefügt werden, da es kein Assembly-Manifest enthält. Wenn ich "tlbexp.exe MyClass.dll" versuche, eine Typbibliothek zu erstellen, tritt ein Fehler auf (der ein Assembly-Manifest enthalten sollte). Dies ist tatsächlich der gleiche Fehler, den ich erhalte, wenn ich versuche, ihn im GAC zu installieren. Ich bin ein bisschen ratlos. Ich verstehe nicht, warum die DLL nicht angezeigt und verwendet wird, es sei denn, sie befindet sich im GAC. Wenn ich diese Methode arbeiten könnte, würde ich sie gerne akzeptieren. Es scheint verrückt zu denken, dass ich versuchen müsste, IPersist und IPersistStream in jeder Klasse zu implementieren, die diese Serialisierung erfordert. Danke noch einmal.

Ich habe auch versucht:
Code:
tlbimp.exe MySerializer.dll /keyfile:My_KeyFile.snk/machine: X86, um die Erstellung einer Assembly-basierten DLL direkt aus der COM-DLL zu erzwingen. Es hat sich nicht beschwert und es wurde eine DLL erstellt. Ich registrierte es, fügte es dem Projekt hinzu und konnte es dem GAC hinzufügen. Als ich den Code ausführte, schaffte es es nach dem vorherigen Fehler und starb, wo es versuchte, eine Klasse in der Zeile zu instanziieren:
Code:
MySerialize.SerializerClass serializer = new MySerialize.SerializerClass (); mit dem Fehler "Das Abrufen der COM-Klassenfactory für die Komponente mit der CLSID {95388FE5-87E8-4164-ADA2-E974FA3803FB} ist aufgrund des folgenden Fehlers fehlgeschlagen: 80040154."} Nicht sicher, ob Ich würde das Fortschritt nennen oder nicht.

80040154: Klasse nicht registriert. Wenn das betreffende Programm 64-Bit ist, können keine 32-Bit-Komponenten (wie die mit VB erstellten) instanziiert werden. A.NET program/Library ist 64-Bit, wenn es auf einem 64-Bit-System ausgeführt wird und CPU-unabhängig (AnyCPU) erstellt wurde. Wenn die Hauptanwendung 64-Bit ist oder mit AnyCPU kompiliert wurde, ist dies nur der Fall Zugriff auf 64-Bit-COM-Komponenten möglich; Dies bedeutet, dass Sie die VB6-Wrapper-Methode nicht verwenden können, da VB6 64-Bit nicht kompilieren kann. Wenn die COM-Komponente, die Sie verwenden möchten, 32-Bit ist, sind alle Wetten deaktiviert und Sie können sie überhaupt nicht verwenden. Nur eine 32-Bit-Assembly kann eine 32-Bit-COM-Komponente verwenden, und nur eine 32-Bit-Assembly kann eine andere 32-Bit-Assembly verwenden. Wenn Sie also Ihr Projekt für die Kompilierung auf x86 ändern, ist dies möglicherweise nicht die Hauptanwendung Sie können Ihre Bibliothek mit AnyCPU verwenden und auf einem 64-Bit-Prozessor ausführen. Sie sind sich nicht sicher, ob dies hilfreich ist: //blogs.msdn.com/b/junfeng/archive/2007/04/14/genman32-a-tool -zum-generieren-von-sxs-Manifest-für-verwaltete-Assembly-für-Registrierung-free-com-net-interop.aspxPersönlich habe ich nie mit dem GAC zu tun oder habe es mit stark benannten Assemblys zu tun, also bin ich gerecht Ich tappe hier im Dunkeln herum. Diese Seite dient anscheinend eher zum Erstellen von Assemblys, die als COM-Komponenten verwendet werden können, und nicht umgekehrt. Es kann jedoch sein, dass die Interop-Assembly ein Manifest benötigt, um von der COM-Assembly abhängig zu sein. Grundsätzlich ist es nicht möglich, auf die IPersistStream-Methode zurückzugreifen (wenn eine 32-Bit-COM-Komponente von einer Bibliothek verwendet werden soll, auf die von einer AnyCPU-kompilierten Assembly zugegriffen wird). Grundsätzlich gilt: -VB6 kompiliert nur 32-Bit-COM-Komponenten. -Eine 64-Bit-Assembly kann keine 32-Bit-COM-Komponenten verwenden. Eine 32-Bit-Assembly kann, aber. Eine 64-Bit-Assembly kann keine 32-Bit-Assemblys verwenden. VB6 kann nur 32-Bit-COM-Komponenten verwenden. Die fragliche COM-Komponente ist also offensichtlich 32-Bit. Grundsätzlich erstellen Sie eine Kette - Hauptanwendung -> Ihre Bibliothek -> VB6-Wrapper -> COM-Komponente. Der VB6-Wrapper ist 32-Bit, also Ihre Bibliothek

32-Bit sein, was bedeutet, dass die Hauptanwendung auch, aber Sie haben keine Kontrolle darüber, wo Sie Probleme haben. Auch wenn Sie den Wrapper entfernen und versuchen, IPersistStream für die COM-Komponente manuell zu verwenden, die COM Komponente ist 32-Bit, so dass Sie das gleiche Problem haben. Bit-Ness-Mismatch ist wirklich alles, was ich mir vorstellen kann, um dies zu erklären.

Ich weiß all Ihre Beiträge zu diesem Thema wirklich zu schätzen. Die primäre Anwendung ist mit Interops geladen, daher glaube ich nicht, dass es sich um ein 32-Bit- oder 64-Bit-Problem handelt. Ich glaube, es ist eine Art Problem im Zusammenhang mit Dingen im GAC, bei denen andere Dinge im GAC benötigt werden, um zu funktionieren. Heute Morgen habe ich eine einfache WinForm-Anwendung mit einem einzigen Knopf geschrieben.
Code:
private void btnCut_Click (Objektabsender, EventArgs e) {string str; object theObj = Activator.CreateInstance (Type.GetTypeFromProgID ("TheObjectData.TheObject")); MySerializer.SerializerClass myClass = new MySerializer.SerializerClass (); Array arr = myClass.ComToBytes (ref str, ref theObj); } Alles, was ich hier getan habe, war sicherzustellen, dass die VB6-DLL registriert wurde, und einen Verweis darauf hinzuzufügen. Wenn die Schaltfläche gedrückt wird, wird die VB6-Klasse instanziiert und eine Methode wird aufgerufen, die ein ordnungsgemäßes Array zurückgibt. Bei der anderen Anwendung gab es einige Komponenten, die den Code zur Laufzeit beschädigten. Dann war es immer eine FileNotFoundException. Wenn ich die DLLs zum GAC hinzufügen würde, würden diese Ausnahmen wegfallen. Also, wenn ich diese DLL nur richtig in den GAC bekommen könnte, denke ich, dass es funktionieren würde. Das Problem ist, dass ich nicht weiß, was ich sonst noch versuchen soll, das Ding da rein zu bekommen. Obwohl der Befehl:
Code:
tlbimp.exe MySerializer.dll /keyfile:My_KeyFile.snk/machine: X86 scheint eine GAC-kompatible DLL direkt aus der VB6-DLL (anstelle einer Typbibliothek) zu erstellen. Ich denke nicht, dass sie wirklich gültig ist. Ich habe noch nie davon gehört, eine Assembly-DLL wie diese zu erstellen. Ich dachte nur, ich würde es versuchen. Es muss etwas fehlen.

Ich habe das gefunden: www.hanselman.com/blog/GotchasAroundPrimaryInteropAssembliesAndTheGAC.aspx

OKAY. Wir können diesen ausschließen. Ich habe eine Baugruppe aus dem VB6 gebaut und sie in den GAC gesteckt. Ich kann die VB6-Klasse instanziieren und eine der beiden Funktionen von C # aus aufrufen. Ich werde einen weiteren Thread für das Problem mit der zweiten Funktion eröffnen. Kurz gesagt, das Problem hing damit zusammen, dass die Assembly nicht ordnungsgemäß erstellt wurde. Dies ist im Grunde, wie dies gehen musste.

  • Erstellen Sie eine VB6-DLL, und stellen Sie dabei fest, dass in VB6 die Typbibliotheksinformationen in die DLL eingebettet sind.
  • Überprüfen Sie mithilfe von OLE Viewer die Typbibliotheksinformationen. Kopieren Sie das in einen Editor und speichern Sie es als IDL-Datei.
  • Verwenden Sie midl, um eine TLB-Datei zu erstellen.
  • Kopieren Sie die TLB und DLL auf meine Entwicklungsmaschine.
  • Registrieren Sie die TLB- und DLL-Datei.
  • Erstellen Sie mit tlbimp eine Assembly aus der tlb-Datei.
  • Registrieren Sie die Assembly.
  • Installieren Sie die Baugruppe im GAC.
  • Verweisen Sie auf die Assembly in dem Projekt.
Danke noch einmal.

Am Ende steht der verwaltete Code, der die nicht verwaltete COM-Komponente verwendet.

Beliebte Beiträge