| | | Was bringt der 3D-Druck in der Elektronik?, eine Pressemitteilung
|
Autor
|
Thema: VB 2010 Express: Fehlermeldung beim Laden einer DLL (4963 mal gelesen)
|
WolfgangSCH Mitglied
Beiträge: 145 Registriert: 01.10.2002 AutoCAD 2021 64-bit Windows 10 64-bit Home Premium AMD Phenom II X6 1055T, 2,8GHz, 8GB RAM
|
erstellt am: 21. Dez. 2010 17:04 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe mit VB 2010 das allseits bekannte Hello World aus der AutoCAD 2010 .NET API Training Labs-VB versucht mit dem Befehl NETLOAD in AutoCAD 2011 zu laden und erhalte permanent eine Fehlermeldung. Auch mit AutoCAD 2010 erhalte ich diese Meldung. Vielleicht kann mir jemand einen Tipp geben. Vielen Dank vorab. Gruß Wolfi Vorgehensweise: VB 2011 Express -> Neues Projekt erstellen -> Klassenbibliothek -> AcDbMgd.dll und Acmgd.dll von AutoCAD 2011 geladen -> Lokale Kopie auf FALSE gesetzt -> codieren ->Debuggen -> LAb1 erstellen -> AutoCAD 2011 aufrufen -> NETLOAD eingeben und zu C:\Dokumente und Einstellungen\XXXXXXXXXX\Lokale Einstellungen\Anwendungsdaten\Temporary Projects\Lab1\bin\Release\Lab1.dll navigieren und Datei Lab1.dll auswählen -> OK Hier der Code:
Code: Imports Autodesk.AutoCAD.ApplicationServices Imports Autodesk.AutoCAD.EditorInput Imports Autodesk.AutoCAD.RuntimePublic Class Class1 <CommandMethod("HelloWorld")> _ Public Sub HelloWorld() Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor ed.WriteMessage("Hello World") End Sub End Class
und hier die Fehlermeldung: Befehl: netload Assembly kann nicht geladen werden. Fehlerdetails: System.BadImageFormatException: Die Datei oder Assembly "file:///C:\Dokumente und Einstellungen\XXXXXXXXXX\Lokale Einstellungen\Anwendungsdaten\Temporary Projects\Lab1\bin\Release\Lab1.dll" oder eine Abhängigkeit davon wurde nicht gefunden. Die Assembly wird von einer Laufzeit erstellt, die aktueller als die derzeit geladene Laufzeit ist, und kann nicht geladen werden. Dateiname: "file:///C:\Dokumente und Einstellungen\XXXXXXXXXX\Lokale Einstellungen\Anwendungsdaten\Temporary Projects\Lab1\bin\Release\Lab1.dll" bei System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) bei System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) bei System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) bei System.Reflection.Assembly.InternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean forIntrospection, StackCrawlMark& stackMark) bei System.Reflection.Assembly.LoadFrom(String assemblyFile) bei Autodesk.AutoCAD.Runtime.ExtensionLoader.Load(String fileName) bei loadmgd() WRN: Protokollierung der Assemblybindung ist AUS. Sie können die Protokollierung der Assemblybindungsfehler aktivieren, indem Sie den Registrierungswert [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) auf 1 festlegen. Hinweis: Die Protokollierung der Assemblybindungsfehler führt zu einer gewissen Leistungseinbuße. Sie können dieses Feature deaktivieren, indem Sie den Registrierungswert [HKLM\Software\Microsoft\Fusion!EnableLog] entfernen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 21. Dez. 2010 17:09 <-- editieren / zitieren -->
Hi, AutoCAD 2010 basiert auf Framework 3.5, ohne Änderungen erzeugt VS2010 eine DLL, die jedoch auf Framework 4.0 aufsetzt. Korrigiere diese Einstellung (Projekteigenschaften) mal auf 3.5 plus nachfolgend neu kompilieren (wenn Du nicht allzuviel im AutoCAD Config-Einträge umschreiben willst und damit ev. andere Apps nicht mehr gehen). HTH, - alfred - ------------------ www.hollaus.at |
WolfgangSCH Mitglied
Beiträge: 145 Registriert: 01.10.2002
|
erstellt am: 22. Dez. 2010 07:32 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, vielen Dank für Deine schnelle und kompetente Hilfe. Ich habe nach Deiner Anweisung das Framework in den Projekteigenschaften von 4.0 auf 3.5 umgestellt und alles funktioniert wie es soll. Vielen Dank! Gruß Wolfi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
WolfgangSCH Mitglied
Beiträge: 145 Registriert: 01.10.2002 AutoCAD 2021 64-bit Windows 10 64-bit Home Premium AMD Phenom II X6 1055T, 2,8GHz, 8GB RAM
|
erstellt am: 22. Dez. 2010 08:00 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, ich hätte noch eine grundlegende Frage an den Fachmann. Ich suche zur Zeit einen Weg meine VB6 Skripte nach VB .NET umzustellen. Bisher habe ich mit einem VB6 Programm AutoCAD gestartet, danach eine DWG aufgerufen und in dieser DWG z.B. Attribute aktualisiert (Zeichnungsrahmen), danach die nächste DWG aufgerufen und bearbeitet usw. Wenn ich das richtig verstanden habe, geht das mit VB 2010 nur noch über Klassenbibliotheken, die ich in AutoCAD wie früher mit VBALOAD VBA-Skripte lade und ausführe. Also ich starte mit dem Programm AutoCAD, lade mit NETLOAD meine DLL und rufe mit dieser eine DWG auf, bearbeite diese und rufe danach die nächste auf usw. Ich habe das auch schon einmal alles wie in VB6 mit VB 2010 probiert, mit dem Ergebnis, dass ich zwar AutoCAD aufrufen konnte, aber nach dem Start von Autocad die DWG nicht geladen wurde. Beispiel siehe hier: http://ww3.cad.de/foren/ubb/Forum110/HTML/000767.shtml Für eine Antwort bedanke ich mich schon einmal vorab. Gruß Wolfi [Diese Nachricht wurde von WolfgangSCH am 22. Dez. 2010 editiert.]
[Diese Nachricht wurde von WolfgangSCH am 22. Dez. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 22. Dez. 2010 08:54 <-- editieren / zitieren -->
Hi, >> Wenn ich das richtig verstanden habe, geht das mit VB 2010 nur noch über KlassenbibliothekenNein, stimmt so nicht (ganz). a) Handling über COM: Du kannst AutoCAD nach wie vor von einer externen EXE aus steuern, dann stehen Dir jedoch nur die COM-Zugriffe auf AutoCAD zur Verfügung, diese sind aber brav und ordentlich vorhanden. Einziges Handicap bei dieser Variante, dass Deine EXE und die AutoCAD-EXE in verschiedenen Speicherbereichen laufen (Schlagwort 'OutOfProcess') und der Datenaustausch darüber heftig langsam ist, also für zeitkritische Anwendungen unbrauchbar. b) Geteilte Applikation: Die andere Variante ist, dass Du eine EXE hast (erstes dotNET-EXE Projekt), diese zuerst AutoCAD startet, dann Deine dotNET-DLL (getrenntes zweites dotNET-DLL-Projekt) ins AutoCAD lädt und startet. Deine EXE ist dann nurmehr für AutoCAD-Prozessstart, Applikationsstart und AutoCAD-Prozessende-Handling verantwortlich (ev. auch für Fehlerhandling, wenn der acad.exe-Prozess stirbt). Deine DLL macht dann das gesamt Handling in der Zeichnung/den Zeichnungen. Wenn Du möchtest, dass ich hinschau, lade die Solution/das Projekt mit Deinem EXE (und der Korrektur lt. meinem letzten Hinweis >>>hier<<<) gezipt hier hoch, dann guck ich, was auf die schnelle getan werden kann. - alfred - ------------------ www.hollaus.at |
WolfgangSCH Mitglied
Beiträge: 145 Registriert: 01.10.2002
|
erstellt am: 22. Dez. 2010 09:36 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, vielen Dank für Deine schnelle und kompetente Antwort. Wenn das Handling über COM wesentlich langsamer ist als über die geteilten Applikationen, werde ich meine Skripte zukünftig über diese geteilten Applikationen realisieren. Vielen Dank für Dein Angebot einmal über mein Projekt zu schauen, aber das hat sich dann hiermit erledigt, da ich diesen Weg nicht mehr verfolgen werde. Gruß Wolfi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 22. Dez. 2010 09:46 <-- editieren / zitieren -->
Hi, >> Wenn das Handling über COM wesentlich langsamer ist Nun, langsamer als das, was Du bisher hattest, ist es nicht. Denn wenn ich richtig verstanden habe, hast Du ja auch eine externe EXE gehabt und über COM das AutoCAD gesteuert; war ja die gleiche Struktur. >> zukünftig über diese geteilten Applikationen realisieren
Diesen Weg hätte ich eigentlich nur mitgelistet, weil's halt geht, aber keinesfalls weil es der beste Weg ist. Natürlich mag es Strukturen geben, die das erforderlich machen, nur ist das Zusammenspiel von 2 VS-Projekten (eines rund um AutoCAD, das andere mitten drin) nicht gerade leicht zu debuggen. Ich würde diesen Weg nur wählen, wenn es nicht anders geht! Und last-but-not-least: Schau Dir die Geschwindigkeitsdifferenz im Verhältnis zu den anderen Teilen der App an! Das Laden der Zeichnung kostet Zeit am Netzwerk, das nachfolgende Speichern der Zeichnung kostet Zeit am Netzwerk, .... wenn Du jetzt gerade mal bei einem Schriftkopf ein paar Attribute änderst und das das ganze Handling an der Zeichnung ist, dann macht das mal ein paar Prozent von dem aus, was an Zeit durch Laden und Speichern der DWG draufgeht, da kannst Du ruhig mit COM arbeiten. Kritisch wird es nur, wenn Du eine Masse von Zeichnungselementen zu bearbeiten hast, dann ist der Faktor aber auch ein anderer, denn dann braucht Deine App deutlich mehr Zeit als Laden/Speichern.
Nicht gleich alles wegschmeissen bitte! Erst vergleichen und nicht unterschätzen, was Debuggen plus Projektpflege von einem vs. zwei Projekten bedeutet. - alfred - ------------------ www.hollaus.at |
WolfgangSCH Mitglied
Beiträge: 145 Registriert: 01.10.2002
|
erstellt am: 22. Dez. 2010 11:52 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, wenn das COM Handling nicht langsamer ist, als das was ich bisher mit VB6 gemacht habe, wäre es ok. Daher möchte ich Dein Angebot doch annehmen, dass Du einmal über den Code mit dem COM Handling schaust, wenn Du Zeit hast. Vielen Dank vorab. Gruß Wolfi [Diese Nachricht wurde von WolfgangSCH am 22. Dez. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 22. Dez. 2010 14:36 <-- editieren / zitieren -->
Hi, hier hast Du Deinen Start, die SLN zu retournieren macht leider keinen Sinn, da Du mir nicht alle Daten übermittelt hast, damit war es nicht kompilierbar. Zu den Projekteinstellungen allgemein: - stelle unter 'Kompilieren' nicht vorgabemäßig Option Strict auf OFF ==> damit entgehen Dir bereits beim Schreiben Deines Programms eine Menge Ungereimtheiten. - arbeite während der Entwicklung nicht im Modus 'Release' ==> denn damit kannst Du keine Haltepunkte sezten, bekommst bei Abbrüchen keine Position des Fehlers, ....
Code: Public Function StartAutoCADSession() As Interop.AcadApplication Dim tRetVal As Interop.AcadApplication = Nothing Dim tErrMsg As String = "" Const tRetriesMax As Integer = 5 Const tRetryWaitTime As Integer = 2 'sekunden Const AcadApp_ActiveXServerName as String = "AutoCAD.Application.18" Try 'Überprüfe, ob AutoCAD schon geladen ist tRetVal = CType(GetObject(, AcadApp_ActiveXServerName), Interop.AcadApplication) Catch ex As Exception 'damit ist zumindest kein gestartetes AutoCAD erkennbar ==> also ein neues starten 'Fehlermeldung müssen wir hier nicht zwischenspeichern End Try If tRetVal Is Nothing Then 'dann versuchen wir, eine neue AutoCAD-Instanz zu starten 'nachdem 'CreateObject' (und VS2010) auf gewissen Maschinen ein TimeOut eingestellt hat, das zu kurz ist, um AutoCAD in der ' Zeit starten zu können, versuchen wir: einmal zu starten, und dann nachträglich erst zu verbinden Try Dim tObj As Object = CreateObject(AcadApp_ActiveXServerName) 'das ist mal anstarten Catch ex As Exception 'geht scheinbar auch nicht tErrMsg = ex.Message 'jetzt machen wir mal Pause, lassen das AutoCAD weiter starten und probieren in Abständen, die ActiveX-Verbindung zu bekommen For i As Integer = 1 To tRetriesMax System.Threading.Thread.Sleep(tRetryWaitTime * 1000) Try tRetVal = CType(GetObject(, AcadApp_ActiveXServerName), Interop.AcadApplication) Catch ex2 As Exception End Try If tRetVal IsNot Nothing Then Exit For Next End Try End If If tRetVal Is Nothing Then Call MsgBox("AutoCAD konnte nicht gestartet werden (Message: '" & tErrMsg & "')") Else tRetVal.Visible = True End If Return tRetVal End Function
Hoffe der Code ist ausreichend kommentiert, - alfred -
------------------ www.hollaus.at [Diese Nachricht wurde von a.n. am 22. Dez. 2010 editiert.] |
WolfgangSCH Mitglied
Beiträge: 145 Registriert: 01.10.2002
|
erstellt am: 23. Dez. 2010 10:09 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, vielen Dank für den Code. Könntest Du mir noch einen Tipp geben wie ich "Interop.AcadApplication" und "AcadApp_ActiveXServerName" definieren kann? Wie gesagt bin ich Umsteiger von VB6 nach VB .NET und habe mich noch nicht sehr tief in die neue Materie eingearbeitet. Der Grund hierfür ist, dass ich VB .NET hauptsächlich für den Umgang mit AutoCAD benötige. Und Voraussetzung ist, dass ich mit VB .NET AutoCAD einwandfrei starten, DWG's laden und verarbeiten kann. Dies ist momentan noch nicht der Fall. Das dies in VB .NET so umständlich geht, hat mich ein wenig enttäuscht. Mit VB6 stelle ich ganz einfach eine Instanz zu AutoCAD her, rufe meine DWG's auf und verarbeite diese extern. Ich musste hier weder Pausen einbauen, um das Programm zu verzögern, noch musste ich DWG-Datenbanken öffnen, speichern und schließen. Auch die Einarbeitungszeit, soweit ich dies jetzt schon abschätzen kann, war wesentlich kürzer. Wenn ich es nicht hinbekommen sollte, AutoCAD einwandfrei extern zu starten, werde ich für diese Projekte weiterhin das gute, alte VB6 benutzen. Gruß Wolfgang Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 23. Dez. 2010 10:28 <-- editieren / zitieren -->
Hi, >> Könntest Du mir noch einen Tipp geben wie ich "Interop.AcadApplication" und "AcadApp_ActiveXServerName" definieren kann? Interop.Application wird dann als gültiger Namespace-Eintrag erkannt, wenn Du am oberen Ende Deines Code-File folgendes definierst: Imports Autodesk.AutoCAD Die Variable 'AcadApp_ActiveXServerName' ist (zugegeben per nachtträglicher Modifikation am Abend) bereits in obiger Antwort von mir im Code enthalten. Const AcadApp_ActiveXServerName as String = "AutoCAD.Application.18" >> Das dies in VB .NET so umständlich geht, hat mich ein wenig enttäuscht. Mit VB6 stelle ich ganz einfach >> eine Instanz zu AutoCAD her, rufe meine DWG's auf und verarbeite diese extern
Nun es ist in VB.NET (für Deinen Fall mit externer EXE) genauso wie VB6, nur eben durch Framework ein wenig anders: Gewöhnung - aber nicht schwieriger oder komplizierter! >> Ich musste hier weder Pausen einbauen, um das Programm zu verzögern
Das war auch für mich neu, keine Ahnung, ob das jetzt durch VS2010 oder Framework 4 so auftritt (ich arbeite zum einen nicht mit externen EXE's, die AutoCAD steuern, zum anderen mit VS2008). Ich geb Dir insofern recht, eigentlich sollte es nicht so sein. Nur deswegen sind wir ja Programmierer geworden, damit wir Symptome erkennen und den Code entsprechend dieser Erkenntnisse (und die Anforderungen) aufbereiten. >> [...] noch musste ich DWG-Datenbanken öffnen, speichern und schließen
Dieser Satz(teil) gibt mir zu denken. Wenn Du keine Zeichnungen öffnest, wozu brauchst Du dann das AutoCAD Wäre ja so als hätte ich ein Auto und noch nie Räder gebraucht. >> Wenn ich es nicht hinbekommen sollte, AutoCAD einwandfrei extern zu starten, >> werde ich für diese Projekte weiterhin das gute, alte VB6 benutzen
Solange Du nur über COM arbeitest, ist das auch vollkommen egal, ob Du den AutoCAD-ActiveX-Server von VB6 oder von dotNET aus steuerst. Der Unterschied wird wohl darin liegen, was in Deiner EXE sich sonst noch so abspielt. Greifst Du z.B. auf Datenbanken oder hast Du Formulare zu erstellen, dann wird Dir nach einiger Zeit mit dotNET klar, dass VB6 im Verhältnis dazu ein Verbrechen war. - alfred -
------------------ www.hollaus.at |
WolfgangSCH Mitglied
Beiträge: 145 Registriert: 01.10.2002
|
erstellt am: 23. Dez. 2010 11:22 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, vielen Dank für Deine Hilfe. Ich werde die Informationen, welche ich von Dir erhalten habe einmal detailiert auswerten und mit dem Code in die eine und andere Richtung noch etwas experimentieren, bis ich zu einem für mich befriedigenden Ergebnis gekommen bin. Zitat: Dieser Satz(teil) gibt mir zu denken...
Mit diesem Satz meinte ich dass man in VB .Net die DWG-Datenbank erst öffnen muss, dann darin Objekte hinzufügen, ändern oder löschen kann und danach die Datenbank wieder schließen (aktualisieren) muss (Stichwort Transaction), was in VB6 alles im Hintergrund passierte. Doch eines würde mich noch interessieren: Warum arbeitest Du mit VS2008 und nicht mit der aktuellen VS2010? Ich wünsche Dir eine geruhsame Weihnachtszeit und einen guten Rutsch ins neue Jahr! Gruß Wolfi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 23. Dez. 2010 11:34 <-- editieren / zitieren -->
Hi, auf TransActions kannst Du getrost verzichten, denn das spielt's nicht mit COM (nun, nicht ganz korrekt, aber von Grundsatz her), Du kannst genauso AcadDoc.ModelSpace.AddLine verwenden und brauchst dazu keine TransAction. TransActions brauchst Du nur, wenn Du auf das managed-Modell von AutoCAD zugreifst (dann aber mit NETLOAD arbeitest und eine DLL hast). >> Doch eines würde mich noch interessieren: Warum arbeitest Du mit VS2008 und nicht mit der aktuellen VS2010?
Weil bis AutoCAD 2011 die VS2008-Version unterstützt ist. VS2010 wird erst bei der ... AutoCAD-Version von Autodesk als Entwicklungsplattform für AutoCAD-Applikationen empfohlen/supportet. Ich sehe auch nicht die großartigen Vorteile von VS2010 (für AutoCAD-Entwicklung wohlgemerkt, andere Applikationsarten schon). - alfred - ------------------ www.hollaus.at |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|