Laden...

Profil von Telefisch

myCSharp.de - Member Mitglied seit

Alle Beiträge

Hallo Ihr Wissenden...
ich glaube ich habe einen Denkfehler aber...

in meinem Excel AddIn (.Net3.5) habe ich folgendes Statement:

System.Configuration.Configuration machineConfig = ConfigurationManager.OpenMachineConfiguration();

Warum bekomme ich das in meiner normalen Forms-Anwendung (auch 3.5) nicht angeboten?

Configuration gibt es da nicht 😦

Ne, ich habs gefunden....
In einem Codeteil den ich vor Urzeiten mal angefasst hab.

Danke

...ich kann mich zwar nicht erinnern, die Listener gelöscht zu haben, aber jetzt funktionierts.

Besten Dank, David

Gruss Carsten

Hallo David,
japp genau da und genau dann.
Also im Fenster "Ausgabe" vom VS, während ich debugge.

Hallo Forum,
ich hab keine Ahnung, was ich falsch mache aber ich bekomme keine Ausgabe im Ausgabefenster, wenn ich debug.writeline aufrufe 😦

Wie bekomme ich das hin?

danke Tele

19.08.2009 - 12:17 Uhr

Hallo...
ich habe heute noch einmal mit der Hotline des Herstellers gesprochen und wieder kam die Diskussion auf, dass Excel schuld sei.
Offensichtlich macht Excel beim Laden der DLLs eine lokale kopie hiervon und da fehlen dann die statischen Abhängigkeiten 😦

Ich habe also mal FUSLOGVW.exe bemüht und bin tatsächlich auf diesen Fehler hier gestoßen:

LOG: Explizite IJW-Bindung. Dateipfad:C:\Programme\EPLAN\Electric P8\1.9.10\BIN\Eplan.EplApi.AFu.dll.
LOG: Die IJW-Assemblybindung hat einen anderen Pfad zurückgegeben: C:\Dokumente und Einstellungen\Fischer\Lokale Einstellungen\Anwendungsdaten\assembly\dl3\9HVVD91E.RWZ\OCAMDONH.VM7\2b776793\0064222f_3199c901\Eplan.EplApi.AFu.dll. Verwenden Sie die gelieferte Datei.

Kennt vielleicht jemand eine Möglichkeit Excel dieses Verhalten ab zu gewöhnen?

Danke Tele

17.08.2009 - 12:11 Uhr

Hi Rainbird...
ich habe es nun mehrfach wieder versucht, kann den Fehler aber nicht erneut auf meinem Rechner erzeugen.
Also die gesuchte assembly ist in jedem Falle durch den Hersteller installiert (zumindest kann ich das in diesem Fall garantieren).

Als ich den Fehler hatte, konnte eine defakto vorhandene Datei nicht gefunden werden.
Hier ist noch ein Kommentar zu diesen Problemen vom Hersteller:

Die Problematik ist darin begründet, dass das P8 API managed C++ ist. Es bietet nach außen hin eine .Net-Schnittstelle und ist nach innen unmanaged C++. Sie laden also im Endeffekt die nativen dlls von P8 in Ihren Prozess und dazu müssen diese Im Pfad liegen.

Offensichtlich hat die Assembly Probleme mit Abhängigkeiten, wenn die dll's irgendwo doppelt vorkommen aber auch das kann ich in diesem Fall ausschließen 🙁
Wie gesagt, im Augenblick läuft es wieder mal bei mir 🙁

23.07.2009 - 14:11 Uhr

Hallo Rainbird,
ich muss diesen Threat mal wieder ausgraben...
Ich habe meine komplette Anwendung mittlerweile zum Laufen gebracht und nach einigen Problemen mit der Setup-Routine auch das hinbekommen.
Alles lief bei mir einwandfrei, bis ein Kollege jetzt auf seinem System das Add-In probieren wollte.
Teile der spät gebundenen Assemblies funktionieren aber bei einigen dll's schmeisst mir :

public static object CreateInstanceFromExternalType( string assemblyPath, string typeName )
        {
            try
            {
                // Externe Assembly laden
                Assembly externalAssembly = Assembly.LoadFrom( assemblyPath, new Evidence( Assembly.GetExecutingAssembly().Evidence ) );

                // Typinformationen abrufen
                Type externalType = externalAssembly.GetType( typeName );
                
                // Instanz erzeugen und zurückgeben
                return Activator.CreateInstance( externalType );
            }
            catch ( Exception ex ) { throw ex; }
        }

eine FileNotFound Exception in der Zeile wo die Assembly geladen werden soll.
Das selbe Phänomen konnte ich jetzt auch auf meinem Rechner verfolgen, allerdings tritt das nicht immer auf.
Woran könnte das liegen? (Die Dateien existieren!)

Danke und Gruss
Carsten

Boah ich bin aber auch ein Vollpfosten 🤔

Irgendwie hat ja ein this.close im Form_Closing Event nix mehr verloren.
Kann mich gar nicht erinnern das da rein geschrieben zu haben. 🤔
...scheiss Alzheimer

Danke für Eure Hinweise.

Hallo herbivore,
ich hatte vergessen zu erwähnen, dass der Fehler im Form-designer beim disposen des Controls auftritt.
Soll ich denn jetzt den automatisch erstellten code bearbeiten?


/// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);  //HIER KNALLTS
        }

Also ich verstehe nicht, was hier Threadübergreifend sein kann.
Ich lade das Form, schließe es und dann kommt der Fehler.
Zwischendurch keinerlei andere Aktion außerhalb des Forms.

Ich hab ehrlich gesagt keine Ahnung, wo ich mit Deinem Beitrag ansetzen soll. 🙁

Hallo Ihr Wissenden...
ich habe mal wieder ein Problem mit meinem Excel-AddIn.
Ich rufe über die Toolbar (Ribbon) eine Form auf.
Alles hat bestens geklappt, bis ich gestern einige Methoden im Form umsortiert habe.
Seit dem bekomme ich beim Schließen des Forms immer den u.a. Fehler.
Woher kann das kommen?
Ich verwende zumindest in meinem Programm keinerlei unterschiedliche Threads.
Es wird auch außer in der Form selbst von nirgends auf diesen Button zugegriffen.
Hat da jemand eine Idee?

System.InvalidOperationException wurde nicht von Benutzercode behandelt.
Message="Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement btnDestProject erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde."
Source="System.Windows.Forms"
StackTrace:
bei System.Windows.Forms.Control.get_Handle()
bei System.Windows.Forms.Control.get_InternalHandle()
bei System.Windows.Forms.Control.DestroyHandle()
bei System.Windows.Forms.Control.Dispose(Boolean disposing)
bei System.Windows.Forms.ButtonBase.Dispose(Boolean disposing)
bei System.ComponentModel.Component.Dispose()
bei System.Windows.Forms.Control.Dispose(Boolean disposing)
bei System.Windows.Forms.ContainerControl.Dispose(Boolean disposing)
bei System.Windows.Forms.Form.Dispose(Boolean disposing)
bei DDT.ESG2007.frmSetup.Dispose(Boolean disposing) in C:\Dokumente und Einstellungen\Fischer\Eigene Dateien\Visual Studio 2008\Projects\DDT.ESG2007\DDT.ESG2007\Setup.Designer.cs:Zeile 20.
bei System.ComponentModel.Component.Dispose()
bei System.Windows.Forms.Form.WmClose(Message& m)
bei System.Windows.Forms.Form.WndProc(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
InnerException:

Danke, Tele

30.06.2009 - 13:24 Uhr

Sodele...
nach ewigen Recherchen nun endlich funktionsfähig!

Mein Problem war zuletzt, dass Setup immer den Pfad zum Manifest in der Registry geändert hat.
Dort wurde dann aus *.vsto|vstolocal immer *.dll.manifest gemacht.
(Der Typ von MS meinte das müsse so sein, nur auf dem Entwicklungsrechner ists vsto)
Jetzt habe ich den Haken bei Assembly signieren entfernt und siehe da, Manifest bleibt... (Im Demo übrigens auch)

Ausserdem wohl ganz wichtig für die Sicherheitseinstellungen ist die InclusionListCommonActions-dll, die in dem o.a. Artikel erstellt wird.
Damit wird, wenn ich es richtig verstanden habe ein Eintarg in der Inclusionlist für Office vorgenommen, damit AddIns auch ohne Zertifikat verwendet werden können.

Also ohne starken Namen und der InclusionList läuft es jetzt bei mir, auch auf "nackten" Client-Maschinen.
Sogar die Erkennung ob alle Voraussetzungen (VSTO) auf der Client-Maschine verfügbar sind hat einwandfri geklappt !

Mann bin ich stolz und glücklich.

HTH Carsten

...eins hab ich noch vergessen...
SP1 für Visual Studio schein enorm wichtig zu sein.

29.06.2009 - 18:08 Uhr

Schau mal in die Registry.
Dort muss es unter HKCU\Software\Microsoft\Office\Excel\AddIn einen Schlüssel geben.
Dort sollte es einen Eintrag "Behavior" geben.
Da muss 3 als Wert (DWORD) eingegeben sein, damit das AddIn automatisch startet.
Dann kann es eventuell auch ncoh möglich sein, dass es Probleme mit den Sicherheitseinstellungen gibt.
Ich habe dazu die beiden o.a. Threats durchgearbeitet.
Besonders im Ersten wird auf das Thema eingegangen.
Bei der Clickonce-Veröffentlichung hat man M.E. zuwenig Einfluss auf das Setup.
Und Du brauchst möglichst ein professionelles Sicherheitszertifikat.

Arbeitest Du denn auch mit Office 2007 und VSTO?

29.06.2009 - 16:02 Uhr

Ich fürchte da hatte ich mich zu früh gefreut...
Bin mittlerweile mit Microsoft in Kontakt.
Offensichtlich bin ich der Erste, der ein AddIn auch verteilen will.
Anders kann ich mir nicht erklären, dass selbst MS mittlerweile über eine Woche dran doktort.

Aber hier gibts nen interessanten Beitrag für die standard Vorgehensweise.
Die hat bei mir funktioniert.

Deploying a Visual Studio Tools for the Office System 3.0 Solution for the 2007 Microsoft Office System Using Windows Installer (Part 1 of 2)
http://msdn.microsoft.com/en-us/library/cc563937.aspx

Deploying a Visual Studio Tools for the Office System 3.0 Solution for the 2007 Microsoft Office System Using Windows Installer (Part 2 of 2)
http://msdn.microsoft.com/en-us/library/cc616991.aspx

...und hier die Primary Interop Assemblies, weil der Link im HowTo tot ist.:
http://www.microsoft.com/downloads/details.aspx?FamilyID=59daebaa-bed4-4282-a28c-b864d8bfa513&DisplayLang=en

Viel Erfolg, Du hast mein Mitgefühl.

...das ist doch schonmal ein Anfang...
Mit VPCs hab ich so meine Probleme, da mein SRM einen Hardlock abfragt und dieser offensichtlich auf VPCs nicht akzeptiert wird (War gestern bei XP-VPC auf dem Win7 Rechner zumindest ein Fehler).
Da muss ich nochmal mit dem Hersteller drüber reden.

Vermutlich wird dann das Emotionslose "Funktioniert nicht mehr" nach dem Start meines Programms gestern auf den Treiber des Hardlocks zurück zu führen sein.
Ich denke bei Treibern sehen die Voraussetzungen etwas schärfer aus 😄

Nun gut. Dann werde ich mir wohl mal ne Batterie VPCs anlegen und das Thema mit dem Hardlock klären.
Mal schauen, ob's gehts.

Danke Euch.

Hallo Forum,
ich habe ja nun schon das ein oder andere zum Laufen gebracht, bin gestern aber darüber gestolpert, dass ein Kollege eines meiner Programme auf Windows 7 installieren wollte.
Da ich auf einem ganz normalen WinXP programmiere frage ich mich, welche Voraussetzungen eigentlich erfüllt werden müssen, damit eine Software auf allen Windows Versionen ab XP läuft.
...sicher wird es verschiedene Voraussetzungen geben sowie vermutlich auch Dinge, die das Erstellen mehrerer Versionen erfordert (denke ich zumindest)
Damit möchte ich auch nur denen Vorbeugen, die einfach nur schreiben würden "...für alle Versionen geht gar nicht".

Ausserdem würde ich gerne einmal ein paar Erfahrungen hören, wie Ihr Eure Programme testet (insbesondere Setup-Routinen).

Vielleicht wäre das hier mal ein Thema für eine FAQ.

besten Dank,
Tele

18.06.2009 - 15:41 Uhr

Hallo herbivore,
es war keineswegs meine Absicht frustiert zu klingen, ganz im Gegenteil, ich bin ja froh, dass sich jemand mit meinem Problem und vielleicht auch mit meiner Unwissenheit beschäftigt.
Ich kann auch nicht wirklich nachvollziehen, wo ich jemandem unfreundlich entgegengekommen bin, ausser als man mir klar machte, dass das doch so schwer nicht sein kann.
Da fühle ich mich insbesondere deswegen angegriffen, weil ich wirklich alles versucht habe was mir aufgetragen wurde, und noch einiges mehr.
Der Lösungsansatz kam ja nunmal immerhin auch von mir (GetProperties).
Wie Du in der Schleife unten sehen kannst, frage ich auch nicht den Namen ab (das hat schon vorher gekracht 😁 ) sondern vergleiche die tatsächliche Property-Bezeichnung und die ist, soweit ich sehen kann einmalig. Wenn es hier aber eine sicherere Methode gibt, bin ich immer bereit dazu zu lernen.

Wenn diese Meldung bei einer direkten Zuweisung nicht kommt, liegt das vermutlich daran, dass es einen entsprechenden impliziten Cast-Operator gibt. Diesen müsstest du dann bei der Reflection-Lösung vermutlich explizit aufrufen.

JAHAAAAAA !!!!
Das war der entscheidende Hinweis...

Da hab ich bei dN!3L nicht ausreichend zwischen den Zeilen gelesen.

Ich danke Euch allen
und entschuldige mich, wenn ich tatsächlich jemanden angegriffen haben sollte.

Tele

18.06.2009 - 14:25 Uhr

Naja, Deine Frage ob ich den Artikel gelesen habe bezog sich für mich eindeutig auf Deinen Vorschlag.

Aber es geht nicht ums Studieren eines Artikels, sondern um das Rausfiltern der Informationen, die man benötigt. [Artikel] Reflection und Metaprogrammierung Abschnitt Objekte erzeugen und manipulieren.
Da steht genau das, was hier bereits schon vorgeschlagen wurde.

genau das habe ich getan, wie auch an meinen Beiträgen zu sehen ist.

Und das ich unkooperativ bin kann ja wohl keiner sagen.
Was kann ich denn noch tun um weiter zu helfen?
Welche Infos fehlen Dir?

Wir sind doch alle nur da, um zu helfen/geholfen zu werden. Vorausgesetzt, der Hilfesuchende zeigt sich kooperativ beim Ausarbeiten der Lösung.

...genau !

Wie bereits weiter oben beschrieben gibt es offensichtlich zweimal das gleiche Property, weswegen das GetProperty nicht funktioniert !!!

Dann habe ich gesehen, dass das Property offensichtlich einen speziellen Typ erwartet, den ich aber mit Reflection noch nicht Casten kann.
Ohne diese Typumwandlung schmeisst mir VS immer einen Fehler.
Bei meinem Allerersten Beitrag habe ich den Fehler geschrieben.

Ich habe mittlerweile folgende Schleife eingebaut:

Type tPropList = pagePropertyList.GetType();
                            PropertyInfo[] propinfo = tPropList.GetProperties();
                            foreach ( PropertyInfo propinf in propinfo )
                            {
                                if ( propinf.ToString() == "Eplan.EplApi.DataModel.PropertyValue PAGE_COUNTER" )
                                {
                                    propinf.SetValue( pagePropertyList, "1000", null );
                                    break;
                                }
                            }

...und habe auch hier einen Fehler, der aber etwas präziser ist:

"Das Objekt mit dem Typ System.String kann nicht in den Typ Eplan.EplApi.DataModel.PropertyValue konvertiert werden."

Also stehe ich nach wie vor vor dem Problem des Castens.

So und jetzt bist Du dran...
Wo war ich unkooperativ?

18.06.2009 - 13:40 Uhr

Hallo dN!3L

Das Casten des Strings zu einem PropertyValue ist eigentlich ein Aufrufen der String-Überladung des impliziten Zuweisungsoperators.

Das Aufrufen der String-Überladung funktioniert aber dann nur implizit, wenn die Assembly eingebunden ist.
Hier muss ich ja offensichtlich explizit Casten.
Da verstehe ich noch nicht, wie das geht.

@Junky:
Sorry, wenn ich nicht innerhalb von zwei Stunden ein Reflection-Profi bin...
Und ja, ich habe ihn angeschaut aber muss zu meiner Schande gestehen, dass ich ihn nicht auswendig gelernt habe.

Aber Du kannst mir sicher zeigen wo ich im erwähnten Artikel etwas von
PropertyDescriptorCollection
PropertyDescriptor
oder der TypeDescriptor-Klasse finde.
Irgendwie bin ich wohl blind oder hast Du den Artikel nicht angeschaut?

18.06.2009 - 12:19 Uhr

Ich glaube es hat was mit dem Value zu tun.

Offensichtlich erwartet die Assembly keinen String, was man ja annehmen könnte, wenn pagePropertyList = "1000" funktioniert sondern einen eigenen Typ namens PropertyValue).
Denn


pagePropertyList.GetType().InvokeMember( "PAGE_COUNTER", BindingFlags.SetProperty, null, pagePropertyList, new object[1] {(PropertyValue)  "1000" } );

funktioniert.

Das bringt mich zum nächsten Problem X(

Wie kann ich per Reflection eine Typumwandlung durchführen?
...meine Birne raucht...

18.06.2009 - 12:06 Uhr

Ja,
PropertyInfo propinfo = tPropList.GetProperty("PAGE_COUNTER", BindingFlags.DeclaredOnly);

Quellcode hab ich net 😉

18.06.2009 - 11:47 Uhr

...immernoch null...
Aber:
Ich habe mal
PropertyInfo[] propinfo = tPropList.GetProperties();
ausprobiert und bekomme tatsächlich 2 mal PAGE_COUNTER

18.06.2009 - 11:34 Uhr

Gleicher Fehler.
[System.Reflection.AmbiguousMatchException] = {"Mehrdeutige Übereinstimmung gefunden."}

MethodInfo mInfo = tPropList.GetMethod( "set_PAGE_COUNTER", new Type[] { } );
gibt auch null zurück.

Also nochmal.
pagePropertyList ist eine gefüllte Variable des Typs PagePropertyList.
Die Eigenschaft "PAGE_COUNTER" enthält auch einen Wert ("999").

pagePropertyList.PAGE_COUNTER = "1000", funktioniert mit früher Bindung einwandfrei.

Was ich nicht ganz verstehen kann, wenn tProplist erzeugt wird, hat es ja nur den Typen, nicht die Instanz auf das Objekt.
Da ist es mir zumindest einleuchtend, dass ich keine Properties lesen kann.
Ich habe doch keinen Verweis auf das pagePropertyList-Objekt bzw die Instanz davon.

🤔

@ JunkyXL: zu welchem Namespace gehört denn das?

18.06.2009 - 11:16 Uhr

Noe...
da bekomm ich folgenden Fehler:
[System.Reflection.AmbiguousMatchException] = {"Mehrdeutige Übereinstimmung gefunden."}

Sobald Public und Instance zusammen kommen.

18.06.2009 - 11:08 Uhr

Das will irgendwie nicht so wie ich.


Type tPropList = pagePropertyList.GetType(); //Der Tp passt !
PropertyInfo propinfo = tPropList.GetProperty("PAGE_COUNTER",BindingFlags.Public | BindingFlags.GetProperty); //ist immer null?

hier habe ich schon diverse BindingFlags probiert aber propinfo ist immer null.
Müsste da nicht das Property drin stehen?

18.06.2009 - 10:20 Uhr

Hallo Forum,
ich hänge mal wieder bei Reflection.
Was bisher geschah:


object pagePropertyList =ExternalTypeHelper.CreateInstanceFromExternalType( strApiFolder + "\\Eplan.EplApi.DataModelu.dll", "Eplan.EplApi.DataModel.PagePropertyList" );

...fehlerfrei, Objekt ist in Ordnung.
Jetzt möchte ich eine Eigenschaft setzen:
So funktioniert es mit sofortiger Bindung:


pagePropertyList.PAGE_COUNTER = "1000";

so hätte ich es umgebaut:


pagePropertyList.GetType().InvokeMember( "PAGE_COUNTER", BindingFlags.SetProperty, null, pagePropertyList, new object[1] { "1000" } );

Ich bekomme immer den gleichen Fehler, dass die Methode "PAGE_COUNTER" nicht gefunden wurde.
Ich habe schon alle möglichen Binding-Flags ausprobiert aber nix geht.
Laut Objektbrowser sieht "Page_COUNTER" so aus:

public Eplan.EplApi.DataModel.PropertyValue PAGE_COUNTER { set; get; }
Member von Eplan.EplApi.DataModel.PagePropertyList

Hat jemand ne Idee, was ich falsch mache?

Tnx Tele

17.06.2009 - 10:56 Uhr

Ok, wenn's ansonsten in Ordnung ist, bin ich zufrieden.

Ein Problem habe ich aber noch...
wie komme ich an Enumerationen dran?

Beispiel : Eplan.EplApi.DataModel.MasterData.PageMacro.Enums.NumerationMode.None
Einfach die Enumeration nachbilden wird ja wohl nicht gehen oder?

tnx Carsten

16.06.2009 - 10:13 Uhr

...nächstes Problem...

foreach-Schleifen

Wie kann man sowas übersetzen?


foreach ( Placement placement in windowMacro.Objects )

sowohl Placement als auch windowMacro gehören zu den spät gebundenen Assemblys.
🤔

EDIT:
Hier mein funktionierender Versuch:


//Original:
                    Hashtable tableVars = new Hashtable();
                    using ( LockingStep oLS = new LockingStep() )
                    {
                        Insert oEplInsert = new Insert();   //Macro
                        #region Fenstermakro lesen
                        if ( Path.GetExtension( MacroName ) == ".ema" )
                        {
                            //Window Macro
                            WindowMacro windowMacro = new WindowMacro();
                            windowMacro.Open( MacroName, oProject );
                            foreach ( Placement placement in windowMacro.Objects )
                            {
                                if ( placement is PlaceHolder )
                                {
                                    PlaceHolder placeHolder = placement as PlaceHolder;
                                    int i = 0;
                                    foreach ( string sVarName in placeHolder.VariableNames )
                                    {
                                        if ( !tableVars.ContainsKey( sVarName ) )
                                        {
                                            tableVars.Add( i, sVarName );
                                            i++;
                                        }
                                    }
                                }
                            }
                            return tableVars;
                        }
                        #endregion


//späte Bindung
                    Hashtable tableVars = new Hashtable();
                    Object oLS = ExternalTypeHelper.CreateInstanceFromExternalType( strApiFolder + "\\Eplan.EplApi.DataModelu.dll", "Eplan.EplApi.DataModel.LockingStep" );
                    {
                        #region Fenstermakro lesen
                        if ( Path.GetExtension( MacroName ) == ".ema" )
                        {
                            //Window Macro
                            Object windowMacro = ExternalTypeHelper.CreateInstanceFromExternalType( strApiFolder + "\\Eplan.EplApi.DataModelu.dll", "Eplan.EplApi.DataModel.MasterData.WindowMacro" );
                            windowMacro.GetType().InvokeMember( "Open", BindingFlags.InvokeMethod, null, windowMacro, new object[2] { MacroName, oProject } );
                            
                            object placeHolders = windowMacro.GetType().InvokeMember( "PlaceHolders", BindingFlags.GetProperty, null, windowMacro, null );
                            int placeHoldersCount;
                            if ( placeHolders is Array )
                            {
                                placeHoldersCount = ( ( Array )placeHolders ).Length;
                                for ( int icount = 0; icount < placeHoldersCount; icount++ )
                                {
                                    Object placeHolder =((Array) placeHolders).GetValue(icount);
                                    int i = 0;
                                    object varNames = placeHolder.GetType().InvokeMember( "VariableNames", BindingFlags.GetProperty, null, placeHolder, null );
                                    int varsCount;
                                    if ( varNames is StringCollection )
                                    {
                                        varsCount = ( ( StringCollection )varNames ).Count;
                                        for ( int iVar = 0; iVar < varsCount; iVar++ )
                                        {

                                            if ( !tableVars.ContainsKey( ( ( StringCollection )varNames )[iVar] ) )
                                            {
                                                tableVars.Add( i, ( ( StringCollection )varNames )[iVar] );
                                                i++;
                                            }
                                        }
                                    }
                                }
                            }
                            return tableVars;
                        }
                    

Aber das ganze kommt mir ein wenig unelegant vor...
Könnte da bitte mal jemand drüber schauen und mir sagen, wo es noch was zu verbessern gibt?
Danke Carsten

16.06.2009 - 09:10 Uhr

Sodele...
hab mittlerweile rausgefunden dass using offensichtlich gar nicht funktioniert.

Wenn ich die using-Anweisung richtig verstanden habe dient sie ja lediglich dazu, das Objekt nach Verwendung direkt zu zerstören.
Wenn die Prozedur aber verlassen wird, wird die lokale Variable doch eh vom Garbage-Collector zwerstört, richtig?
Dann kann ich mir das using und ein eventuelles manuelles disposen doch sparen oder?

tnx Carsten

15.06.2009 - 23:18 Uhr

Jaja, ist schon klar, hast ja auch Recht.
So sollte das nicht aussehen.
Ich dachte nur, dass es so etwas leichter verständlich für mich wird.

Wenn ich zum Beispiel folgende Zeile sehe:
using ( LockingStep oLS = new LockingStep() )
sehe ich es richtig, dass ich hier dann

using ( Object oLS = ExternalTypeHelper.CreateInstanceFromExternalType(apiPath + "\\Eplan.EplApi.DataModelu.dll","Eplan.EplApi.DataModel.Lockingstep"))

verwende?

Und für diese Zeile muss ich dann wohl erst auf dem gleichen Weg ein ProjectManager-Object erzeugen, bevor ich dann auf ExistsProject und Openproject zugreifen kann?

if ( new ProjectManager().ExistsProject( DestinationProject ) )
                        {
                            oProject = new ProjectManager().OpenProject( DestinationProject );

Wie gesagt, Du sollst mir nicht die Hausaufgaben machen nur ist es etwas problematisch für mich das, naja, doch ziemlich abstrakte denken gleich auf die ganze Klasse zu übertragen weil zwischendurch debuggen geht nunmal nicht.
Und dann ist es etwas blöd, wenn in der gesamen Klasse das oProject nicht passt.
(und die ganzen anderen Methodenaufrufe, Objekte und Eigenschaften.)
Keine Sorge, Mein Freund (Visual C# Kompendium) und ich arbeiten schon dran. Ist halt schön, wenn man weiß, dass man auf dem richtigen Weg ist 😉

Deswegen wollte ich nur einen Hinweis für den richtigen Weg.

tnx Carsten

15.06.2009 - 15:31 Uhr

hmm...
danke.

Bei mir sieht es dann so aus:
Globals.ThisAddIn.Application.DisplayStatusBar = true;

Hatte immer nach Application gesucht und da gibts keine Statusbar.
Manchmal sieht man den Wald vor lauter Bäumen nicht.

greets Tele

15.06.2009 - 15:25 Uhr

Hallo Rainbird...
nach einigen anderen kleineren Projekten muss ich mich doch wieder diesem üblen Thema widmen...

Ich habe mein AddIn mittlerweile zum Laufen bekommen, allerdings mit eingebundenen Assemblies.
Nun muss das ganze auf späte Bindung umgebaut werden.

Dazu könntest Du mir vielleicht noch einmal einen kleinen Schubser geben...

Folgender Code soll zum Beispiel auf späte Bindung umgebaut werden:

private Project oProject;

private bool OpenProject( string DestinationProject )
        {
            try
            {
                if ( oProject != null && oProject.Properties.PROJ_FULL_PROJECTPATH != DestinationProject )
                {
                    oProject.Close();
                    oProject = null;
                }

                if ( oProject == null && EplApp != null )
                {
                    using ( LockingStep oLS = new LockingStep() )
                    {

                        if ( new ProjectManager().ExistsProject( DestinationProject ) )
                        {
                            oProject = new ProjectManager().OpenProject( DestinationProject );
                            
                            return true;
                        }
                        else
                        {
                            return false;
                        }
                    }
                }
                else
                    return true;
            }
            catch ( Exception ex )
            {
                throw ex;
            }
        }

die private Variable oProject würde ich zunächst erst einmal als Object deklarieren. Richtig?
Wenn oProject dann einmal richtig erzeugt ist, kann ich dann einfach auf Beispielsweise oProject.Properties zugreifen oder wie muss das dann aussehen?

Boah irgendwie kapier ich das garnicht (hatte grade versucht zu coden, was ich verstanden hab, komme aber schon mit oProject = new ProjectManager().OpenProject(DestinationProject) überhaupt nicht klar) 🙁

Könntest Du mir vielleicht nochmal den o.a. Code umbauen, bitte?
vielleicht vertsehe ich das dann für meinen restlichen Code selbst umzubauen ...

Sorry, dass ich mich so dämlich anstelle 🤔

tnx Carsten

Hiho...
ich hab mal wieder Probleme, bei denen ich auf keinen grünen Zweig komme.

Ich habe mir mit makecert und pkv2pfx ein Zwertifikat erstellt (eigentlich mittlerweile mehrere mit und ohne Passwort)

Wenn ich meine Assembly signieren will kann ich dieses Zertifikat auswählen und bekomme dann beim ersten Auswählen eine Frage nach einem Passwort.
Ich gebe das PW also ein und bekomme die Meldung zurück, dass das Netzwerkkennwort falsch ist.
Warum?
Was hat das Zertifikat mit dem Netzwerk zu tun?
Ist es von Bedeutung, wo ich das Zertifikat speichere? (lokal oder NW war bei diesem Fehler im übrigen unerheblich)

Bin für jeden Tipp dankbar!

tnx Tele

Hallo Allerseits...
ich muss diesen Threat nochmal raus kramen.
Ich habe Probleme mit einem Office-Plugin, dass ich einfach nicht installiert bekomme.
Mittlerweile gehe ich davon aus, dass es am Zertifikat liegt.
Mal angenommen ich würde ein kostenpflichtiges Zertifikat für ein Jahr kaufen.
Was passiert dann nach einem Jahr?

Wenn das Zertifikat für ein Jahr gültig ist, muss dann auch nach diesem einen Jahr neu installiert werden?

Wie machen andere Developer das? Ein Plugin für, sagn wir mal, 500€ verkaufen und dann lebenslang Zertifikate davon bezahlen?

Kann man dieses blöde Zertifikat nicht umgehen? Das riecht für mich extrem nach Abzocke.

tnx Tele

BTW...
gibts irgendwo ein durchgängiges HOWTO, was beschreibt, wie man das Zertifikat erstellt und einbindet? Oder mit anderen Worten die Sicherheit gewährleistet...?
Diese MSDN-Link-Orgien gehen ja gar nicht.

08.06.2009 - 11:40 Uhr

Hallo Forum...
nun bin ich schon einige Tage dabei mein Excel-AddIn zu deployen und komme einfach nicht weiter.
Ich habe mittlerweile raus gefunden, dass ich offensichtlich dieses ominöse ComAddInShim verwenden muss.
Ich habe das Beispiel Hier ausprobiert und es hat augenscheinlich geklappt.
Jetzt versuche ich das auf mein AddIn zu übertragen und stoße beim Kompilieren auf folgenden Fehler:

Fehler 4 error C3861: "assert": Bezeichner wurde nicht gefunden. c:\Dokumente und Einstellungen\Fischer\Eigene Dateien\Visual Studio 2008\Projects\DDT.Dialogs\COMAddInShim\CLRLoader.cpp 147 COMAddInShim

Da sich der Fehler im COMAddInShim befindet und dieses in C geschrieben ist, weiß ich nicht weiter.
Am AddIn kanns doch eigentlich nicht liegen. Das ist genau das gleiche wie im Beispiel.

Kann mir jemand einen Tipp geben?

Danke Tele

Hallo herbivore,
danke für die schnelle Antwort.

greets Tele

Hallo Leutz...
nachdem ich nun Probleme mit den Sicherheitseinstellungen mithilfe von caspol versucht habe zu beheben, möchte ich mir irgendwo anschauen, ob die neuen Richtlinien eingetragen wurden.
In meiner Systemsteuerung (Verwaltung) vermisse ich jedoch das Configuration-Tool vom .Net.

Wo kann ich denn die Einstellungen einsehen?

caspol -machine -list gibt mir zwar jede Menge Einträge aber ich finde eigentlich nichts identifizierbares außer System.* Einträge und das kann ja nicht alles sein.

Gibt es da noch andere Möglichkeiten an die Sicherheitseinstellungen dran zu kommen?

Danke Tele

03.06.2009 - 08:23 Uhr

Hallo Ihr Wissenden...

ich habe mittlerweile mein AddIn für Excel lauffähig, möchte jetzt aber noch die ein oder andere Statusmeldung anzeigen.
Jetzt gibt es in Excel ja eine Statusleiste, wo M.E. auch eine Progressbar integriert ist.
Wie komme ich da dran?

Ich hab schon alles mögliche versucht aber finde nichts.
Ich kann mich dunkel erinnern, vor ein paar Jahren aus VBA heraus auf die Statusleiste zugreifen gekonnt zu haben.

Kann mir jemand nen Tipp geben, bitte?

Danke
greets Tele

29.05.2009 - 14:03 Uhr

So denn...
Also ich hab jetzt alle Dateien (außer *.pdb) eingepackt und in mein Programm-verzeichnis gelegt.

Dann noch die entsprechenden Schlüssel eingetragen (hier InnoSetup):


Root: HKCU; Subkey: "Software\Microsoft\Office\Excel\Addins\DDT.AddIn"; Flags: uninsdeletekey
Root: HKCU; Subkey: "Software\Microsoft\Office\Excel\Addins\DDT.AddIn"; ValueType: string; ValueName: "Description"; ValueData: "DDT.AddIn - Excel AddIn"
Root: HKCU; Subkey: "Software\Microsoft\Office\Excel\Addins\DDT.AddIn"; ValueType: string; ValueName: "FriendlyName"; ValueData: "DDT.AddIn"
Root: HKCU; Subkey: "Software\Microsoft\Office\Excel\Addins\DDT.AddIn"; ValueType: dword; ValueName: "LoadBehavior"; ValueData: "00000003"
Root: HKCU; Subkey: "Software\Microsoft\Office\Excel\Addins\DDT.AddIn"; ValueType: string; ValueName: "Manifest"; ValueData: "{pf}\DDT\DDT.AddIn\DDT.AddIn.vsto|vstolocal"

dann musste ich noch eine Erweiterung der Path-Variable machen, da mein SRM noch zusätzliche DLLs erzeugt, die Excel sonst nicht findet.

...und alles wurde gut 😁

28.05.2009 - 15:37 Uhr

Hallo Forum,
ich habe eine Frage zum Erstellen einer Setup-Routine für ein Excel-AddIn.

Ich habe schon einige Stunden damit zugebracht herauszufinden, was wirklich alles mitgeliefert werden muss und vor allem, wie ich das AddIn registrieren muss damit Excel es automatisch bereit stellt.

Weder die erste noch die zweite Frage konnten bis dato beantwortet werden.
Dann bin ich in der MSDN auf einen Artikel gestoßen in dem es heißt, dass Office2007 AddIns über ClickOnce verteilt werden müssen.
Das find ich prinzipell schonmal doof aber damit könnte ich leben nur...

Mein AddIn wird vor dem ausliefern mit einem SRM verschlüsselt. Wenn ClickOnce jedoch die neue Datei direkt hochlädt habe ich auf die einzelnen DLLs keinen Einfluss mehr oder wie funktioniert ClickOnce?

Kann mir alternativ jemand sagen, was zu meiner DLL noch alles mitgeliefert werden muss?
Im Release-Ordner habe ich zusätzlich zu meiner DLL noch folgende Dateien:
Microsoft.Office.Interop.Excel.dll
Office.dll
sowie
*.vsto,
*.manifest,
*.config und
*.pdb (die kann ich wohl vergessen)
von meiner DLL

Was muss davon alles mitgeliefert werden und wo speicher ich das auf dem Ziel-PC am besten hin?

Vielleicht weiß ja auch noch jemand, wie ich das Registrieren muss.
Die Einträge unter "[HKEY_CURRENT_USER\Software\Microsoft\Office\Excel\Addins&quot; reichen nicht. Damit Erkennt Excel das AddIn nicht.
Ich komme auf diese Schlüssel, da VS dort die gleichen Schlüssel angelegt hat.
Irgendwo muss es anscheinend noch weitere Einträge geben.

...danke für jeden Tipp

Tele

Das bringt mich nicht weiter...

Hält denn nun der Threat das Objekt oder führt er nur Methoden aus?
Wenn er das Objekt nicht halten kann, bringt das in meinem Fall gar nichts.
Wenn doch, dann wie?

Wie starte ich den Threat so, dass er das Objekt (die Klasse mit der API) erzeugt und ich dann drauf zugreifen kann?

Tele

...ich kapier das nicht...

Also ich brauche also einen neuen Thread.
Wenn ich das richtig verstehe, ist dieser nur zum Ausführen von Methoden und nicht zum speichern von Klassen, respektive Objekten oder wie sehe ich das?

Und wo bleibt dann der Worker?
Ist der hinfällig?

uupps...
da gibts was zu lesen 😄

Dank Dir erst mal,
melde mich, wenns weitere Probleme gibt.

Ah ok...
das könnte ich versuchen.
Wie löse ich denn aus dem GUI Threat dann Ereignisse im worker-Threat aus bzw. wie rufe ich dort Methoden auf?

Ja schon...
da gebe ich Dir prinzipiell Recht nur wenn ich den Worker das nächste mal aufrufe gibts wieder Brösel, weil das Objekt bereits einmal aufgerufen wurde.
Hier mal ein Zitat aus der Hilfe:

Make sure to call Exit() only one time in your application. It is currently not possible to use Init("") after Exit(), while the application is still running.

...das heißt, dass ich das Objekt nur ein mal erzeugen darf...

Ausserdem dauert das erste Erzeugen auch schon recht lange, deswegen will ich es nicht jedes mal neu erzeugen...

Eben hab ich versucht dieses Objekt an den Thred zu übergeben, bekomme aber den gleichen Fehler.

Hallo Forum,
ich habe in meinem Excel-AddIn einen ziemlich zeitaufwändigen Vorgang, den ich gerne mit einer Progressbar visualisieren möchte.

Jetzt habe ich mir das Thema Backgroundworker mal angeschaut um den Vorgang in einen anderen Threat auszulagern.

Mein Problem ist jetzt Folgendes:

Ich verwende eine Drittanbieter-API in diesem Vorgang.
Hier wird ein Objekt erzeugt, dass eine Schnittstelle zu einer Software bereit stellt.
Der Hersteller sagt ausdrücklich, dass dieses Application-Object nur einmal innerhalb eines Programmes erzeugt werden darf.
Ich habe das natürlich erstmal ignoriert und versucht dieses Object im BG-Worker zu erzeugen.
Prompt gibt es eine Fehlermeldung:
[System.Threading.ThreadStateException] = {"Ungültiger Threadzustand für den auszuführenden Vorgang."}
Ich denke, dass dieser Fehler mit genau dieser API zu tun hat, da er beim Initialisieren der Application hoch kommt.

Jetzt meine Frage...
Wenn es nicht möglich ist, diese Arbeiten in einem eigenen Threat laufen zu lassen, wie kann ich dennoch eine Progressbar zuverlässig füttern?
Oder gibt es eine schnelle bzw. einfache Möglichkeit dem Worker dieses Objekt zu übergeben ?

Danke , Tele

Hallo...
ich möchte diesen Threat genau aus dem o.a. Grunde wieder ausgraben...

Was macht man mit der Exception?
Ich habe das gleiche Problem, noch im Debug-Modus.
Ich möchte natürlich nicht, dass das zur Laufzeit passiert.
Bei meiner App handelt es sich um ein Excel-Addin.

Muss ich den Fehler behandeln?
Wenn ja, wie?

Greets Tele

20.05.2009 - 10:17 Uhr

Hallo Leute...
ich möchte diesen Threat mal wieder vorkramen, weil ich die beiden Projekte sehr interessant finde.

Leider scheint das ganze etwas eingeschlafen zu sein.

Gibt es mittlerweile weitere Versionen der Projekte?

@wizer...
Du bist noch eine Antwort schuldig :evil:
...gibst Du den Quellcode frei?

Mich würde nämlich ebenfalls die Kombination aus beiden Boxen interessieren und da muss man das Rad ja nicht ein zweites mal erfinden...

greets Tele

13.05.2009 - 09:30 Uhr

Bestens...
mehr brauch ich net.

Ich muss halt lesen und schreiben können.
Wenn ich als ReadWrite ohne Fehler öffnen kann, passts.

Danke Tele