Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Inventor .NET AddIn Erfahrungen...

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Inventor .NET AddIn Erfahrungen... (3761 mal gelesen)
daywa1k3r
Ehrenmitglied V.I.P. h.c.
Softwareentwickler



Sehen Sie sich das Profil von daywa1k3r an!   Senden Sie eine Private Message an daywa1k3r  Schreiben Sie einen Gästebucheintrag für daywa1k3r

Beiträge: 3497
Registriert: 01.08.2002

erstellt am: 16. Aug. 2004 16:50    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


HelloWorld.zip

 
Hallo Leute,

also, ich habe mich in den letzten paar Tagen mit den Beispielen von Inventor .NET auseinander gesetzt. Es gibt noch keine .NET Schnitstelle für Inventor, deswegen werde ich auf das Schreiben eines Beispiel verzichten. Ja, es wäre schon möglich, aber da der Zugriff über COM Schnittstelle erfolgt, ist es nichts anderes als in VB. Von dem her - Wurst. Die Erfahrungen, die ich aber teilen möchte, beziehen sich auf das Implementieren von einer in .NET geschriebenen DLL in Inventor. Als Beispiel werde ich eine ganz simple "Hello World" Datei nehmen, wobei ich die Grafische Oberfläche mit Objekten < 9 aufbaue. Also keinen UserInterfaceManager, da ich das Gefühl habe, dass es noch ein wenig bugy ist. Aber sobald ich ein wenig mehr Zeit habe, stelle ich auch ein Beispiel mit neuen Objekten von Inventor 9 rein. Möglicherweise werden sich hier der Eine oder der Andere mit manchen Abschnitten unterfordert fühlen. Falls das so sein sollte, einfach überspringen was bereits bekannt ist.

Betriebssystem: Win2000 SP3 und WinXp Professional
.NET Umgebung: Visual Studio 2003

Bei .NET gibt es keine kostenlose, integrierte Entwicklungs Umgebung wie Visual Basic for Application. Es soll aber eine kostenlose Entwicklungs Umgebung namens #Developer geben, aber da ich mit Visual Studio 2003 arbeite, habe ich mich nicht so richtig dafür interessiert, so kann ich auch nicht sagen, ob alles was mit VS 2003 ( kostenpflichtig ) auch mit #Developer ( kostenlos ) machbar ist. Aber, wenn ich es richtig verfolgt habe, gibt es hier ein paar Leute die mit #Developer arbeiten, daher einfach mal im Forum nachfragen.

1. Starten von einem neuen .NET Projekt

In geöffneten VS 2003 über Datei / Neu / Projekt ( Strg + Umschalten + N ) kommen Sie zu dem "Neues Projekt" Dialog:

In dem linken Fenster haben Sie die Möglichkeit den Typ von Projekten auszuwählen. Dabei können Sie zwischen verschiedenen Sprachen wählen. Zu Sprachen muss folgendes gesagt werden... Aus ein paar Grunden hat die Wahl von Sprachen in .NET an Bedeutung verloren. Alle Sprachen der .NET Umgebung, greifen auf gleiche .NET Bibliotheken drauf zu. Und egal mit welcher Sprache der Code geschrieben wird, nach der Kompilierung entsteht ein Intermediate Language Code. Also nicht wie gewöhnlich werden die Quellcodes in Maschinen Code  übersetzt, sonder in einer Art Prozessor unabhängigen Zwischencode, der zur Laufzeit ( Just In Time ) in Maschinen Code umgewandelt wird. Das Ganze erinnert stark an Java Virtual Machine, wobei die Laufzeitumgebung in .NET den Namen Common Language Runtime trägt.

Also kurz und schmerzlos, ohne irgendwelche pro und kontra Selbstgespräche über die Wahl der Sprache anzufangen: ich habe mich für C# entschieden.

In dem rechten Fenster können Sie zwischen ein paar schon vorgefertigten Vorlagen, die verschiedene Projekt Arten darstellen, wählen. Da wir unsere "Applikation" in Inventor integrieren wollen, wählen wir aus den vorlagen "Klassenbibliothek" aus. Jetzt muss nur noch der Name und der Speicherort angegeben werden, und schon kann es los gehen.

2. VS 2003 Oberfläche

Auf den ersten Blick erinnert die Oberfläche an die Microsoft Visual Studio 6.0. Es gibt einen "Projektmappen-Explorer", "Eigenschaften Fenster", das "Code Fenster", ... Als erstes ist mir der Tabbed Style des Hauptfensters positiv aufgefallen.

Egal welchen Typ von Dokumenten wir mal aufgemacht haben ( Quallcode einer Klasse, eine Form, ein Icon, Hilfe Datei, ... ) wird der selbe als Tab in das Hauptfenster eingebunden. Das ermöglicht schnelles wechseln zwischen den Fenstern. Die restliche Oberfläche passt sich dynamisch den momentanen Stand der Entwicklung an. zB wenn ein Formular in das Projekt eingefügt wird, wird die seitliche Toolbox Leiste um die Steuerelemente erweitert die zu den Formularen gehören. Die Toolbox öffnet sich automatisch sobald man mit der Maus darüber fährt. Die restliche Zeit ist sie platzsparend eingezogen. Die Menüleiste, und auch der ganze Oberflächenlayout ist benutzer anpassbar.

Im Hauptfenster kann der Code mit einem Klick auf das "+" Zeichen "Windows Explorer like" erweitert werden, und auf das "-" geschlossen werden. So werden aus den Klassen oder Funktionen immer jeweils eine Zeile. Auf dieser Weise bekommt man den Code sehr übersichtlich.

3. Das von Wizard erstellte Projekt

Das Projekt beinhaltet eine Klasse Class1.cs, AssemblyInfo.cs und ein paar wichtige Verweise. In dem Quelltext Editor wird die Datei Class.cs angezeigt. Als erste Zeilen sehen wir: "using System;". Damit wird der Namespace (System) dem Compiler bekannt gemacht, so dass der Zugriff auf aller Klassen diesen Namespace möglich ist. Die Zeile ClassLibrary1 definiert unseren eigenen Namespace. Alle Zeilen die mit "//" anfangen, stellen die Kommentare dar. Die Kommentare die mit "///" anfangen beinhalten einen XML Code und dienen zur Erstellung eines Webberichts. Der Assistent hat innerhalb des Namenraums eine Klasse Class1 erstellt, worin das eigentliche Programm zu schreiben ist. Es ist auch eine AssemblyInfo.cs Datei erstellt worden. In dieser Datei befinden sich die Metadaten von der gesamten Assembly ( Versionsnummer, Digitalesignatur, ... ). Der Assistent hat auch ein paar der wichtigsten Verweise auf die .NET Klassen zu unserem Projekt hinzugefügt. Die jenigen die wir benutzen wollen, müssen aber über die using-Direktive dem Compiler bekannt gemacht werden.

4. Anpassen des Projektes auf unsere Bedürfnisse


  • Verweis
    Als erstes setzen wir einen Verweis auf die Inventor Object Libary. Dazu klicken wir mit der RMT auf Verweise und wählen "Verweis hinzufügen". Danach erscheint der "Verweis hinzufügen" Dialog. Sparen Sie sich die Suche nach InventorObjectLibery unter .NET Komponenten. Da ist noch nichts vorhanden. Um die Komponente einzufügen wechseln Sie zu COM Komponenten, und wählen da "Autodesk Inventor Object Libary". Danach kann der Dialog geschlossen werden. Anschliessend machen wir die Komponente über der using-Direktive noch dem Compiler bekannt, und schon können wir drauf zugreifen.

  • Vererbung
    Eines der wichtigsten Markenzeichen einer echten Objekt orientierten Programmierung ist die Vererbung. Ziel der Vererbung ist Wiederverwendung von Klassen, so kann von einer vorhandenen Klasse eine neue abgeleitet werden. Die neue Klasse verfügt über die Daten und Methoden der ursprünglichen ( Basis ) Klasse. Ableiten von einer Klasse erfolgt mit der Eingabe eines Doppelpunkts:

    Zitat:

    ------ Erstellen gestartet: Projekt: ClassLibrary2, Konfiguration: Debug .NET ------

    Ressourcen werden vorbereitet...
    Verweise werden aktualisiert...
    Hauptkompilierung wird durchgeführt...

    Erstellung abgeschlossen -- 0 Fehler, 0 Warnungen
    Satellitenassemblies werden erstellt...

    ---------------------- Fertig ----------------------

        Erstellen: 1 erfolgreich, 0 fehlgeschlagen, 0 übersprungen


    Gut so ! Nach dem wir die DLL kompiliert haben, brauchen wir die CLSID Nummer um die REG Datei zu erstellen. Um die raus zu kriegen, gehen wir in die Registry und suchen nach HelloWorld.Class1 ( immer NameSpace.KlassenName ). Und ? Nichts gefunden. Also gehen wir in die Eigenschaften vom Projekt / Konfigurationseigenschaften / Für COM-Interop registrieren und setzen den Wert auf True. Übernehmen die Einstellungen mit "Ubernehmen" und schliessen den Dialog mit OK. Danach kompilieren wir die Anwendung noch ein mal. Schauen wir uns danach das Ausgabe Fenster noch ein mal an:

    Zitat:

    ------ Erstellen gestartet: Projekt: ClassLibrary2, Konfiguration: Debug .NET ------

    Ressourcen werden vorbereitet...
    Verweise werden aktualisiert...
    Hauptkompilierung wird durchgeführt...

    Erstellung abgeschlossen -- 0 Fehler, 0 Warnungen
    Satellitenassemblies werden erstellt...
    Die Projektausgaben für COM-Interop werden registriert...

    ---------------------- Fertig ----------------------

        Erstellen: 1 erfolgreich, 0 fehlgeschlagen, 0 übersprungen


    Wenn wir jetzt erneut in der Registry nach HelloWorld.Class1 suchen werden wir fündig. Der Eintrag müsste so aussehen:

    Doppelklicken wir mal auf den Eintrag (Standard) in dem rechten Fenster und kopieren uns den kompleten Wert in eine Textdatei. Die Nummer werden wir brauchen um eine REG Datei zu erstellen.

    Notice !!! Bei jeder Kompilierung wird eine neue CLSID erstellt. Um das zu vermeiden, schreiben Sie bitte die Zeile:

    Zitat:

    [GuidAttribute(" Ihre CLSID Nummer ")]



    vor der Klasse Class1. Damit haben wir eine Art von Projekt Kompatibilität erstellt, und es wird nicht immer eine neue CLSID erstellt.

  • Reg Datei

    Jetzt müssen wir nur noch dem Inventor klar machen, dass er unsere DLL beim Start mit lädt. Das können wir mit einer REG Datei machen. Eine Reg ( extention .reg ) Datei sieht in etwa so aus:

    Zitat:

    REGEDIT4

    [HKEY_CLASSES_ROOT\CLSID\{AE1BA67B-6910-3321-8A12-2A4517EA2DC3}]
    @="C# Inventor HelloWorld"
    [HKEY_CLASSES_ROOT\CLSID\{AE1BA67B-6910-3321-8A12-2A4517EA2DC3}\Description]
    @="This is the sample Add-In by daywa1k3r"
    [HKEY_CLASSES_ROOT\CLSID\{AE1BA67B-6910-3321-8A12-2A4517EA2DC3}\Implemented Categories\{39AD2B5C-7A29-11D6-8E0A-0010B541CAA8}]
    [HKEY_CLASSES_ROOT\CLSID\{AE1BA67B-6910-3321-8A12-2A4517EA2DC3}\Required Categories]
    [HKEY_CLASSES_ROOT\CLSID\{AE1BA67B-6910-3321-8A12-2A4517EA2DC3}\Required Categories\{39AD2B5C-7A29-11D6-8E0A-0010B541CAA8}]
    [HKEY_CLASSES_ROOT\CLSID\{AE1BA67B-6910-3321-8A12-2A4517EA2DC3}\Settings]
    "LoadOnStartUp"="1"
    "Type"="Standard"



  • Kopieren Sie den Text in einen Text editor
  • Ersetzen Sie die CLSID Einträge durch ihre CLSID
  • Speichern Sie die Datei als HelloWorld.reg.
  • Als Speicherort wählen Sie am besten den Speicherort des Projektes.


    Nach dem Ausführen der Datei werden Sie gefragt, ob Sie die Einträge in Registry eintragen wollen. Bestätigen Sie diese und auch die nächste Meldung mit OK. So, jetzt dürfte der Inventor auch wissen, dass es unseren AddIn gibt, und dass der beim Start geladen werden soll.

    Notice !!! Noch ein Unterschied zwischen COM und .NET Komponenten ist, dass die .NET Komponente ihre Selbstbeschreibung in Form von Metadaten mit sich trägt. Die COM Komponenten haben die Beschreibung von Klassen und Methoden in Typbibliotheken, die ausserhalb der Komponenten gespeichert sind. Aus diesem Grund war nach jedem Kompilieren eine Registrierung beim Betriebssystem nötig. Bei .NET Komponenten ist die Registrierung über Regsvr32 nicht mehr nötig. Die fertigen Dateien sind sofort lauffähig, und müssen zB. beim Setup einfach in das Zielverzeichnis kopiert werden. Das erleichtert den Setup Vorgang um einiges. Man spricht da von XCopy Deployment, da die Installation mit einem einfachen Copy Befehlt erfolgt.

    Wenn wir jetzt Inventor starten müsste unter Extras / Anpassen unser HelloWorld AddIn zu sehen sein.

    5. Grafische Oberfläche

    Als erstes deklarieren wir zwei private Variablen in unserer Class1:ApplicationAddInServer:

    Code:

    private Inventor.Application oApp;
    private ButtonDefinitionHandler oButtonHelloWorld;


    Weiter geht es in der #region ApplicationAddInServer Member, und zwar sind da vier public Funktionen zu sehen:

    Code:

    public void ExecuteCommand (int CommandID)
    public object Automation
    public void Deactivate()
    public void Activate (ApplicationAddInSite AddInSiteObject, bool FirstTime)

    Die ersten zwei interessieren uns nicht sonderlich, daher einfach auf das "-" klicken und aublenden. 


  • public void Activate wird aufgerufen wenn Inventor versucht unser AddIn zu laden. AddInSiteObject und FirstTime sind zwei Parameter die die Funktion mit sich bringt. Der Parameter FirstTime hat in unserem Beispiel nicht viel zu tun, da wir hier noch ohne den UserInterfaceManager arbeiten. Dieser Parameter wird erst ab der Version 9 interessant sein, daher gehe ich jetzt nicht näher darauf ein. Der erste Parameter ist für uns sehr wichtig, weil wir darauss unser Inventor.Application Object holen:

    oApp = AddInSiteObject.Application;

    Danach werden wir ein Icon für unseren HelloWorld Button laden. Da ich Autodesk Sample nicht öffnen konnte, musste ich selbst erst sehr viel rumprobieren, bis ich den richtigen Weg gefunden habe. Später bin ich dann darauf gekommen, dass ich die Dateien die sich nicht öffnen lassen, einfach mit einem Code Editor betrachten kann ( RMK ). Ich hätte mir da schon ein paar Stunden sparen können, da die Funktion ImageToPictureConverter genau die gleiche ist wie in dem Autodesk Sample   Egal. Da ich ja viel probiert habe, musste ich das in ein try-catch einschliessen. Das ist der nächste Unterschied zur zB. VB OnErrorResumeNext, den es nicht mehr gibt. Aber ich gehe jetzt nicht auf try-throw-catch-finally näher ein. Zurück zu den Images... Der Witz ist nämlich, dass Inventor als Icon genau den Typ IPictureDisp erwartet. Alles andere wird einfach nicht angezeigt. Und die Funktion ImageToPictureConverter erwartet ein Image und liefert ein iPictureDisp zurück. iPictureDisp ist ein Mitglied von stdole, daher ist es nötig, dass wir die stdole über der using-Direktive mit in das Projekt einbinden:

    using stdole;

    Wenn es um das Laden von Bildern geht, gibt es zwei Möglichkeiten: 1. Die Bilder von der Festplatte laden 2. Die Bilder in das Projekt einbinden. Ich habe mich für die Möglichkeit zwei entschieden. Um eine Bild Datei in das Projekt einzufügen, einfach mit der RMT auf das Projekt klicken und dann auf "Hinzufügen / Vorhandenes Element hinzufügen", und die ( in meinem Fall ) BPM laden. Danach erscheint die Datei im Projekt direkt. Das einzige was noch getan werden muss, ist in den Eigenschaften die "Buildaktion" auf "Eingebettete Ressource" setzen. Visual Studio 2003 besitzt auch einen Image Editor, so dass wenn man "Hinzufügen / Neues Element hinzufügen / Bitmap Datei" wählt, automatisch der Editor geöffnet wird.

    Notice !!! Die Icons für Autodesk Inventor müssen eine feste Grösse haben, und zwar: small -> width = 16px; height = 15px; und large -> width = 24px; height = 22px; Alle anderen Grössen werden von Inventor skalliert, und sehen danach dementsprechend aus.

    Also, weiter geht es mit definieren von Buttons... Wir brauchen ein Bitmap Object, an das Object übergeben wir das Bild aus der Ressource, danach konvertieren wir das Ganze in das iPictureDisp und übergeben es an unsere Variable iPictureDisp.

    Vierzeiler:

    Code:

    Bitmap MyBitmap;
    MyBitmap = new Bitmap (this.GetType(), "HelloWorld.bmp");

    IPictureDisp IconHelloWorld;
    IconHelloWorld = ImageToPictureConverter.Convert (MyBitmap);


    Das Gleiche als Einzeiler:

    Code:

    IPictureDisp IconHelloWorld = ImageToPictureConverter.Convert (new Bitmap(this.GetType(), "HelloWorld.bmp"));

    Die Funktion this.GetType() liefert ein Array von Typ Type zurück, wo die ganzen definierten Typen aus der Assembly definiert sind.

    So, jetzt können wir ein ButtonDefinitionHandler erstellen:

    Code:

    oButtonHelloWorld = AddInSiteObject.CreateButtonDefinitionHandler ("HelloWorldIntCmd1", CommandTypesEnum.kShapeEditCmdType, "C# Hello World", "HelloWorld Sample by daywa1k3r written in C#", IconHelloWorld, IconHelloWorld)

    Die Sachen innerhalb "" sind Strings und bedeuten: Internal Name, Description, ToolTipText, ...

    Notice !!! Die InternalNames von den Buttons müssen eindeutig sein. Zwei gleiche InternalNames führen zu Fehlern.

    Danach definieren wir einen OnClick Event für den ButtonHandler:

    Code:

    oButtonHelloWorld.OnClick += new ButtonDefinitionHandlerEventsSink_OnClickEventHandler (oButtonHelloWorld_OnClick);

    Wenn wir jetzt versuchen das Projekt zu kompilieren, würden wir einen Fehler erhalten:

    Der Name "oButtonHelloWorld_OnClick" besteht nicht in der KLasse oder dem Namespace "HelloWorld.Class1"

    Also müssen wir die Funktion schnell schreiben, und die soll nichts anderes machen, als eine MessageBox ausgeben.

    Code:

    private void oButtonHelloWorld_OnClick()
    {
    MessageBox.Show ("Hello World", "C# Hello World");
    }

    So, jetzt dürfte sich das Projekt wieder kompilieren lassen.


  • public void Deactivate();
    In dieser Funktion müssen wir "alle" Objecte die wir zur Laufzeit geladen haben wieder freigeben. Normalerweise übernimmt die Laufzeitumgebung die ganzen "clean arbeiten" ( Garbage Collection ), aber irgendwie waren die Sachen nicht frei zu geben. Möglicherweise lag es daran, dass zB. oApp nicht mit new zu aloizieren war. Wie auch immer, es war nicht so leicht das Object frei zugeben. Mit einer gesunder Mischung aus MarshalReleaseComObject und expliziten Aufruf der GarbageCollection ging es dann doch.
    Code:

    if (oApp != null) Marshal.ReleaseComObject (oApp);

    GC.WaitForPendingFinalizers();
    GC.Collect();


    Irgendwie erscheint mir die ganze Lösung nicht so logisch, aber es funktioniert. Die Funktion Mashal.ReleaseComObject dekrementiert den Verweiszähler des bereitgestellten Runtime Callable Wrapper. Soweit, so gut. Laut MSDN ist es so, dass bei jedem Eintrit eines COM Schnittstellenzeigers in die CommonRuntimeLanguage wird, dieser in einem RCW gewrappt wird. Mit Marshal.ReleaseComObject (oObject); wird das COM Object oObject freigegeben. Um sicher zu gehen, dass kein Objekt mehr geladen ist, ist empfohlen eine while Schleife zu benutzen bis die Marshal.ReleaseComObject eine Null liefert. Das hab ich auch gemacht, aber leider ohne Erfolg. Erst wenn ich zusätzlich die GarbageCollection explizit aufgerufen habe ( im normalen Fall wird die GarbageCollection von Laufzeitumgebung automatisch durchgeführt ), funktionierte es. Alleine GarbageCollection half mir auch nichts, daher habe ich zum Anfang gesagt, dass eine gesunde Mischung zum Erfolg führt.


So, das wäre in etwa alles, was beachtet werden muss, um ein "leeres" AddIn zu erstellen. Kompilieren Sie jetzt das Projekt, und in Inventor unter Zusatz Module müsste unsere Anwendung aufgelistet sein. Über Anpassen, können Sie dann HelloWorld Toolbar sichtbar machen, und nach einem Klick auf das HelloWorld Button müsste eine MessageBox mit "Hello World" kommen.

Das waren meine ersten Erfahrungen mit C# und .NET AddIn. Ich hoffe, hiermit dem einem oder anderem ein paar Stolpersteien aus dem Weg geräumt zu haben. Ich melde mich wieder nach dem Urlaub, wenn ein wenig mehr Zeit da ist, und dann aber mit einem grösseren Beispiel.


------------------
Grüße daywa1k3r

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

mapcar
Mitglied
CADmin



Sehen Sie sich das Profil von mapcar an!   Senden Sie eine Private Message an mapcar  Schreiben Sie einen Gästebucheintrag für mapcar

Beiträge: 1250
Registriert: 20.05.2002

Time flies like an arrow, fruit flies like a banana (Groucho Marx)

erstellt am: 16. Aug. 2004 18:52    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für daywa1k3r 10 Unities + Antwort hilfreich

Hi Igor,

ich hab das zwar erstmal überflogen, aber der Beitrag sieht einfach ***super*** aus, richtig schön gemacht!

Ich werde mich jetzt erstmal auf deine Idee zu Marshal.ReleaseComObject() stürzen - damit habe ich nämlich auch in AutoCAD zu kämpfen - und dann werde ich mir dein Posting (besser: dein als Posting verkleidetes Tutorial) in aller Ruhe zu Gemüte führen.

Danke, Axel Strube-Zettler

------------------

Meine AutoLisp-Seiten
Meine private Homepage
Mein Angriff auf dein Zwerchfell
Mein Lexikon der Fotografie
Mein gereimtes Gesülze

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

daywa1k3r
Ehrenmitglied V.I.P. h.c.
Softwareentwickler



Sehen Sie sich das Profil von daywa1k3r an!   Senden Sie eine Private Message an daywa1k3r  Schreiben Sie einen Gästebucheintrag für daywa1k3r

Beiträge: 3497
Registriert: 01.08.2002

erstellt am: 16. Aug. 2004 22:24    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hi Axel!

Jo, danke erstmal 

Hmm der Marshal... Ich habe auch sowas probiert:

Code:

while (Marshal.ReleaseComObject (oApp) > 0)
{
    Marshal.ReleaseComObject (oApp);
}

Aber ohne Garbage bekomme ich das Object einfach nicht frei. Eigentlich halb so wild, aber trotzdem komisch.

PS: Ich habe in dem Projekt den Release und Debug Ordner gelöscht. Jetzt wollte ich es nochmal starten, und hab gemerkt, dass Registrierung für COM-Iterop wieder auf False gerutscht ist. Also bitte beachten:

Projekt / Konfigurationseigenschaften / Für COM-Interop registrieren und den Wert auf True setzen.

Bis dann...

------------------
Grüße daywa1k3r

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

chris_we
Mitglied
Entwickler

Sehen Sie sich das Profil von chris_we an!   Senden Sie eine Private Message an chris_we  Schreiben Sie einen Gästebucheintrag für chris_we

Beiträge: 3
Registriert: 07.07.2004

erstellt am: 20. Aug. 2004 14:06    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für daywa1k3r 10 Unities + Antwort hilfreich

Hi,
hat schom mal jemand versucht die FileUIEvents unter .net anzusprechen?
(Wenn man das Event benutzt, stürzt der Inventor bei "Komponente plazieren" im Zusammenbau ab.) Unter VB6 läuft das ganze einwandfrei...

Nebenbei hätte ich noch eine ganz andere Frage: Kann man irgendwie an den "Komponente erstellen"-Knopf im Zusammenbau ran? Ich würde dem Filedialog der dort aufgeht, gerne einen eigenen Dateinamen vorschlagen.

Merci.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

mapcar
Mitglied
CADmin



Sehen Sie sich das Profil von mapcar an!   Senden Sie eine Private Message an mapcar  Schreiben Sie einen Gästebucheintrag für mapcar

Beiträge: 1250
Registriert: 20.05.2002

Time flies like an arrow, fruit flies like a banana (Groucho Marx)

erstellt am: 20. Aug. 2004 21:32    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für daywa1k3r 10 Unities + Antwort hilfreich

Hi Chris,

da kann ich dir nicht helfen...

> gehen wir in die Eigenschaften vom Projekt /
> Konfigurationseigenschaften / Für COM-Interop registrieren und
> setzen den Wert auf True

Hmmm, da steige ich noch nicht durch. Läuft das Programm denn als Server? Wenn ich das richtig kapiert habe, verursacht das doch einen Aufruf von regasm und erzeugt eine .tlb?

Unter AutoCAD habe ich eine ganz andere Erfahrung gemacht: Ich hab den Schalter mal aus Neugier auf true gesetzt - und schon hat der Mechanismus der Anmeldung neuer AutoCAD-Befehle über das [CommandMethod("...")]-Attribut nicht mehr funktioniert, es kam nur noch "Unbekannter Befehl...".

Gruß, Axel Strube-Zettler

------------------

Meine AutoLisp-Seiten
Meine private Homepage
Mein Angriff auf dein Zwerchfell
Mein Lexikon der Fotografie
Mein gereimtes Gesülze

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

daywa1k3r
Ehrenmitglied V.I.P. h.c.
Softwareentwickler



Sehen Sie sich das Profil von daywa1k3r an!   Senden Sie eine Private Message an daywa1k3r  Schreiben Sie einen Gästebucheintrag für daywa1k3r

Beiträge: 3497
Registriert: 01.08.2002

erstellt am: 20. Aug. 2004 23:09    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

@chris_we

Also, FileUIEvents habe ich mal getestet.

Es funktioniert:

OnFileOpenDialog
OnFileNewDialog ( wobei hier kein NewDialog erscheint wenn ich das Event benutze  )
OnFileSaveAsDialog

Es funktioniert nicht:

OnFileInsertDialog ( Da will er den Bericht senden  )

Aber so wie es aussieht, wäre damit möglich, das was du vor hast ( Dateiname vorschlagen ).

Tja, bleibt nichts anderes als warten.

@ Axel

Also, bei mir hat sich überhaupt nichts getan ohne "setzen den Wert auf True".

Und da die dll nicht per Hand registriert werden muss, gehe ich davon aus, dass diese Option regasm ausführt. Warum es in AutoCAD nicht funktioniert, weiss ich nicht. Musst du deine Anwendung immer mit regasm registrieren ? Ich glaube der wichtigste Unterschied zwischen Inventor und AutoCAD ( wobei ich mir da bei AutoCAD gar nicht sicher bin ) ist, dass bei Inventor die AddIns automatisch geladen werden ( Registry Einträge ), und bei AutoCAD passiert es mit AppLoad oder AsmLoad. Nämlich in diesen Moment, wo ich den Haken draussen gehabt habe, wurde meine Anwendung nicht mehr geladen. Also, es scheint unter Inventor nicht ohne zu funktionieren. Vielleicht führt AutoCAD automatisch eine Registrierung beim Aufruf von AsmLoad ?

Tja, such Frodo such...

------------------
Grüße daywa1k3r

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

mapcar
Mitglied
CADmin



Sehen Sie sich das Profil von mapcar an!   Senden Sie eine Private Message an mapcar  Schreiben Sie einen Gästebucheintrag für mapcar

Beiträge: 1250
Registriert: 20.05.2002

Time flies like an arrow, fruit flies like a banana (Groucho Marx)

erstellt am: 21. Aug. 2004 00:13    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für daywa1k3r 10 Unities + Antwort hilfreich

> Tja, such Frodo such

Genau das isses: Seit ich das einmal registriert habe - nee: haben lasse - geht nix mehr. Kein neuer AutoCAD-Befehl mehr! Und ich suche das vor allem in der Registry, aber ich finde es nicht! Ich kann es nicht mehr löschen. Ich kann das ganze Projekt-Verzeichnis nicht mehr löschen! Irgendwer hat da jetzt den Daumen drauf: *Registriert*!!!

Na ja, eine Kopie, woanders, unter leicht verändertem Namen läuft. OK, hab schon Schlimmeres mitgemacht, und ich werde das Ergebnis dann hier mitteilen, wenn ich eine Lösung gefunden habe.

Gruß, Axel Strube-Zettler

------------------

Meine AutoLisp-Seiten
Meine private Homepage
Mein Angriff auf dein Zwerchfell
Mein Lexikon der Fotografie
Mein gereimtes Gesülze

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz