Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  C#.NET Specified cast is not valid.

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:  C#.NET Specified cast is not valid. (2614 mal gelesen)
fuchsi
Mitglied
Programmierer c#.net Datawarehouse


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

Beiträge: 1201
Registriert: 14.10.2003

AutoCad Version 2012 deu/enu
<P>Windows 7 64bit

erstellt am: 27. Apr. 2009 16:36    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

Wir haben in einer Managed DLL eine Routine für Lisp, die einfach ein externes Programm startet, und auf deren Beendigung wartet. (ähnlich dem Lispbefehl (startApp "notepad"), jedoch mit warten auf die Beendigung.


Das funktioniert auch auf den meisten Rechnern (momentan auf ca. 40 Rechhner gestestet). leider kommt jedoch bei manchen Rechnern folgende Fehlermeldung in der Autocad Befehlszeile

Befehl (startapplication "notepad")    Anmerkung Notepad startet, und autocad wartet bis zum Schliessen, und dann kommt die fehlermeldung

System.InvalidCastException: Specified cast is not valid.
   at Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi, Object
commandObject, Boolean bLispFunction)
   at
Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorkerWithExceptionFilter(MethodInfo
mi, Object commandObject, Boolean bLispFunction)
   at Autodesk.AutoCAD.Runtime.PerDocumentCommandClass.Invoke(MethodInfo mi,
Boolean bLispFunction)
   at Autodesk.AutoCAD.Runtime.CommandClass.CommandThunk.InvokeLisp(); Fehler:
Fehler bei ADS-Anforderung


Code:

        [LispFunction("StartApplication")]
        public Object XCADToolsStartApplication(ResultBuffer args)
        {
            string tFileName = "";
            string tArguments = "";

            int i = 0;
            foreach (TypedValue rb in args)
            {
                i += 1;
                if ((i == 1) && (rb.TypeCode == RTSTR)) { tFileName = rb.Value.ToString(); }
                if ((i == 2) && (rb.TypeCode == RTSTR)) { tArguments = rb.Value.ToString(); }
            }
            try
            {
                System.Diagnostics.Process TProcess = new System.Diagnostics.Process();
                TProcess.StartInfo.FileName = tFileName;
                TProcess.StartInfo.Arguments = tArguments;
                TProcess.Start();
                TProcess.WaitForExit();
                TProcess.Close();
                return true;

            }
            catch (System.Exception)
            {
                return false;
            }
        }




Ändere ich nun den Typ der Funktion von

public Object XCADToolsStartApplicationi ..  auf
public Boolean XCADToolsStartApplicationi ..

dann funktioniert es wieder auf ALLEN Rechnern.

Aber wie mache ich eine Lispfunktion, die z.B.: nil oder einen String zurückgibt?. Dann muss ich ja den Funktionstyp auf Objekt setzten, weil sonst RETURN einen fehler aufwirft.

Und warum funktioniert es auf 90% der Rechner, und auf 10% nicht ??


[Diese Nachricht wurde von fuchsi am 27. Apr. 2009 editiert.]

[Diese Nachricht wurde von fuchsi am 27. Apr. 2009 editiert.]

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


Ex-Mitglied

erstellt am: 27. Apr. 2009 21:21    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

aus meiner Sicht ist lautet die Deklaration

Code:
public ResultBuffer XCADToolsStartApplication(ResultBuffer args)

D.h. Object ist noch gültig, aber Return-Werte wie Boolean oder String sind nicht zugelassen, diese sind in der Struktur von 'ResultBuffer' zurückzugeben.

- alfred -

------------------
www.hollaus.at

fuchsi
Mitglied
Programmierer c#.net Datawarehouse


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

Beiträge: 1201
Registriert: 14.10.2003

AutoCad Version 2012 deu/enu
<P>Windows 7 64bit

erstellt am: 28. Apr. 2009 08:55    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

Zitat:
Original erstellt von a.n.:
D.h. Object ist noch gültig, aber Return-Werte wie Boolean oder String sind nicht zugelassen, diese sind in der Struktur von 'ResultBuffer' zurückzugeben.

Obwohl es gerade mit Object manchmal nicht funktioniert, Boolean jedoch schon.

Aber egal.
Meine Funktion sollte also eher so ausschauen:

Code:
[LispFunction("StartApplication")]
        public ResultBuffer XCADToolsStartApplicationi(ResultBuffer args)
        {
            string tFileName = "";
            string tArguments = "";

          ResultBuffer tResultBuffer = new ResultBuffer();

            int i = 0;
            foreach (TypedValue rb in args)
            {
                i += 1;
                if ((i == 1) && (rb.TypeCode == RTSTR)) { tFileName = rb.Value.ToString(); }
                if ((i == 2) && (rb.TypeCode == RTSTR)) { tArguments = rb.Value.ToString(); }
            }
            try
            {
                System.Diagnostics.Process TProcess = new System.Diagnostics.Process();
                TProcess.StartInfo.FileName = tFileName;
                TProcess.StartInfo.Arguments = tArguments;
                TProcess.Start();
                TProcess.WaitForExit();
                TProcess.Close();
              tResultBuffer.Add(new TypedValue((int)LispDataType.T_atom));

            }
            catch (System.Exception)
            {
                tResultBuffer.Add(new TypedValue((int)LispDataType.Nil));
            }
            return tResultBuffer;
        }


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

fuchsi
Mitglied
Programmierer c#.net Datawarehouse


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

Beiträge: 1201
Registriert: 14.10.2003

AutoCad Version 2012 deu/enu
<P>Windows 7 64bit

erstellt am: 28. Apr. 2009 11:37    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

in einem PDF der Autodesk Univerity habe ich foglende Aussage gelesen.

Code:
In these examples the LISP function name is “HelloWorld”. When the (HelloWorld) function is
run from AutoLISP the .NET helloWorld function will be called. Notice that a ResultBuffer is
passed into the function and is returned. The ResultBuffer contains arguments that allow data to
be passed between AutoLISP and the .NET function. In AutoCAD 2008 a ResultBuffer is the
only type that can be returned.
This should not be a major issue as the ResultBuffer can contain
different types of data.
The ResultBuffer contains TypedValues. A TypedValue is a data pair. (Data type and the data
value) When you create a new ResultBuffer you can pass in TypedValues to the constructor.
The LispDataType object will allow you to easily set the type. Here are the Result Type codes
that can be used for the data type. (These are 16 bit integer codes)
_atom Nil DottedPair ListEnd
ListBegin Point3d Orientation ObjectId
Angle Point2d None SelectionSet
Void Int32 Int16 Double
Text


Es funktioniert zwar mit String Boolean usw., weil vielleicht doch noch aus Kompatibilitätsgründen irgendwelche
Cast-Rotuninen drin sind, die dürften aber anscheinend manchmal danebengehen.

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

fuchsi
Mitglied
Programmierer c#.net Datawarehouse


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

Beiträge: 1201
Registriert: 14.10.2003

AutoCad Version 2012 deu/enu
<P>Windows 7 64bit

erstellt am: 28. Apr. 2009 13:45    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

Einen gravierenden Nachteil hat der Resultbuffer: Er gibt alles mittels Klammer zurück !!!

z.B.:

Code:
[LispFunction("Test")]
public ResultBuffer LispFunctionsREPLACE(ResultBuffer args)
{
  ResultBuffer tResultBuffer = new ResultBuffer();
  tResultBuffer.Add(new TypedValue((int)LispDataType.Text, "zurückzugebendeer String"));
  return tResultBuffer;
}


(test) > ergibt ("zurückzugebendeer String")

Code:
[LispFunction("Test")]
public String LispFunctionsREPLACE(ResultBuffer args)
{
  return "zurückzugebendeer String";
}

(test) > ergibt "zurückzugebendeer String"  und so soll es auch sein !!!!!


Da ich nun bereits einige Funktionen für Lisp bereitgestellt (replace, padl, padr, trim, ltrim, rtrim usw.) habe, und diese auch schon in vielen Lisps verwende
würde das bedeuten, dass ich alle meine Lisp überarbeiten muss, da ich mit einem anderen Rückgabewert rechne?

Schöne ********.

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