Laden...

Forenbeiträge von John444 Ingesamt 42 Beiträge

21.01.2008 - 16:31 Uhr

Hallo Miteinander,

welche Profiler können die Funktionsaufrufe einer bestimmten Klasse / Schnittstelle zählen.

Ich habe es mit ProfileSharp 1.3 versucht. Das Problem ist, dass ich nach dem Start der Applikation einen schwarzen Bildschirm zu sehen bekomme. Genauer gesagt das Hauptfenster ist schwarz. Die Menüs kann ich z.B. lesen. Wenn sich ein Dialog öffnet ist wieder alles schwarz bis auf die Buttons...

Weiß einer woran das liegen könnte oder kennt einer alternativen für meinen Anwendungsfall?

Zusatzinfos:
.NET 2.0 Applikation
VS 2008

Danke

Gruß

John

20.01.2008 - 14:47 Uhr

Ich hatte das gleiche Problem:

Bei mir war es auch ein Problem mit den Referenzen.

Geh mal alle durch und prüfe ob sie überhaupt noch benutzt werden. Im VS 08 gibt es da mittlerweile auch ein Button der dies automatisch überprüft.

Ich habe dann alle überflüssigen Referenzen gelöscht und schon lief alles wieder schnell.

20.01.2008 - 14:24 Uhr

Wenn ich ProfileSharp öffne sind das Hauptfenster und einige weitere Bereiche schwarz...

weiß einer woran das liegen kann?

Falls keiner eine Lösung hat würde mir eine alternative zu ProfileSharp auch helfen.

In erster Linie suche ich ein Programm welches die Anzahl der Funktionsaufrufe eines bestimmten Interfaces zählt.

Habt ihr da was für mich?

Danke

20.11.2007 - 10:32 Uhr

Richtig mit Delegaten... hab sie so zwar noch nie gebraucht Funktioniert aber super.

Damit andere auch was davon haben hier kurz die Lösung.


public class TypeHelper
{
public delegate bool TypeHelperFunction(MyClass myClass);

public static bool IsX1(MyClass myClass)
{
....
}

public static bool IsX2(MyClass myClass)
{
...
}

}



//Hier wird der delegate übergeben, jetzt ist es logisch (-;
private MyClass CreateXAlg (TypeHelper.TypeHelperFunction fkt)
{
if (fkt(...))
{...}
}



CreateXAlg(TypeHelper.IsX1);
CreateXAlg(TypeHelper.IsX2);

Also Danke

16.11.2007 - 17:40 Uhr

Hallo Miteinander...

ist es möglich eine (static) Funktion zu übergeben?

So ist es jetzt:



private MyClass CreateX1 (...)
{
if (TypeHelper.IsX1(...))
{
 // hier passiert was
}
}

private MyClass CreateX2 (...)
{
if (TypeHelper.IsX2(...))
{
  // hier passiert was
}
}

CreateX1(...);
CreateX2(...);


Wie geht das?



private MyClass CreateXAlg (typeHeplerFunktion)
{
if (typeHeplerFunktion(...))
{
 // hier passiert was
}
}

CreateXAlg(TypeHelper.IsX1);
CreateXAlg(TypeHelper.IsX2);


Danke

21.12.2006 - 12:29 Uhr

@herbivore

hab die DLL jetzt in Applicationsverzeichnis gelegt und oh wunder ... alles funktioniert.

Danke.

21.12.2006 - 11:31 Uhr

Hallo User.

Ist es möglich eine Referenz dynamisch nachzuladen?

Ich habe folgendes Problem:

Ich will über einen Pfad eine DLL nachladen. Dies mach ich mit folgender Funktion:


Assembly assembly = Assembly.LoadFrom(sDllPath);
            foreach (Type t in assembly.GetTypes())
            {
                MethodInfo methodInfo = t.GetMethod("StartClient");
                if (methodInfo != null)
                {
                    methodInfo.Invoke(null, new object[] { srvOpt });
                    
                    break;
                }
            }
            

Klappt auch soweit das die Methode StartClient (ist staic) aufgerufen wird.
Die Methode StartClient startet im Client einen IPC Remoting Server.

Ich kann aber nur auf den Remoting Server zugreifen wenn im StartProgramm (da wo die obenstehende Fkt aufgerufen wrude) auch eine Referenz (Im VS 2005 über ADD Reference eingefügt) existiert.

Da ich aber alles über den DLL Pfad realisieren möchte, ist die Frage ob ich das gleiche was ich im VS 2005 über ADD REFERENCE mache auch mit einem Befehl machen kann... wenn ja wie lautet der Befehl...

Ich hoffe es ist verständlich.

Danke

11.12.2006 - 13:40 Uhr

danke... das war ein Fehler in meinem Code...

es gab noch einen Fehler in meiner Validate Funktion... (-:
so ist es richtig:


data.Schemas.Add(m_schemaNamespace, m_fullXsdFilePath);
data.Load(xmlReader);

so... wenn dann das validieren funktionier hat würde ich den MemoryStream gerne in ein File schreiben...
gibt es da was?

Hab auf die schnelle nichts gefunden!

Thx

11.12.2006 - 12:45 Uhr

Hallo svenson,

danke für den Hinweis.

Wollte die ganze Sache jetzt mal umsetzen... da gibts aber ein paar Probleme:

So schreibe ich die XML Datei


XmlSerializer xmlSer = new XmlSerializer(typeof(ServerOptions));

//Stream fs = new FileStream(Application.StartupPath + @"\Option.xml", FileMode.Create);

Stream fs = new MemoryStream();
XmlWriter xmlWriter = new XmlTextWriter(fs, Encoding.UTF8);
xmlWriter.Flush();
xmlSer.Serialize(xmlWriter, myOpt);
            
isValidXml();

xmlWriter.Close();

Hier will ich überprüfen... aber wie? wo liegt der Fehler?
So gehts nicht....
Wie bekomme ich den MemoryStream wieder in die XML???


        public bool isValidXml()
        {
            
            XmlDocument data;
            try
            {
                
                
                XmlReader xmlReader = new XmlTextReader(fs);

                data = new XmlDocument();
                data.Schemas.Add(m_schemaNamespace, xmlReader);
                data.Load(m_fullXmlFilePath);
                data.Validate(null);
            }
            catch (Exception exp)
            {
                return false;
            }
            return true;
        }


Wenn ich das zuerst in die Datei schreibe dann klappt alles

08.12.2006 - 14:01 Uhr

gibt es auch eine Möglichkeit ein Objekt, welches man später als XML-Datei serialisieren will, gegen eine XSD zu validieren? Oder muss man immer den Umweg über die Datei gehen.

Ich stell mir folgendes Szenario vor:

  1. XML Objekt wird erstellt und gefüllt
  2. Prüfen ob es gegen eine XSD valide ist
  3. XML-Datei erstellen, wenn es valide ist SONST Fehler

Danke

07.12.2006 - 13:28 Uhr

Hallo...

Mit dem Tool xsd.exe habe ich mir von meiner XSD-Datei eine cs-Datei erstellt. Mit dem Parameter /classes.

Diese Klasse fülle ich wie folgt:


options1 myOpt = new options1();
myOpt.db = new dbtype();
myOpt.main = new maintype();
myOpt.remote = new remotetype();
         
myOpt.db.constring = "test";
myOpt.main.modelname = "test";
myOpt.main.modelpath = @"C:\test\";
myOpt.remote.pc = "derpc";
myOpt.remote.weiter = "hallo";

So erstelle ich dann die XML-Datei: (kommt aus der MSDN, OK so?)


XmlSerializer xmlSer = new XmlSerializer(typeof(options1));

Stream fs = new FileStream(Application.StartupPath + @"opt.xml", FileMode.Create);
XmlWriter writer = new XmlTextWriter(fs, Encoding.Unicode);
xmlSer.Serialize(writer, myOpt);
writer.Close();

Die erstellte XML Datei ist auch valide gegen meine XSD also alles super.

In der Zeile:


XmlSerializer xmlSer = new XmlSerializer(typeof(options1));

kommt aber folgende Exception: (ja zwei mal)

A first chance exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.dll
A first chance exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.dll

Warum kommen die... ist ja nicht schön... lauften tut aber alles.

Danke

06.12.2006 - 14:52 Uhr

ich sollte also nur globale typen verwenden wenn ich sie auch wirklich häufiger brauche

sonst halt fall 2... richtig.

06.12.2006 - 14:19 Uhr

Hallo...

ich schreibe gerade eine XSD die später eine XML-Datei validieren soll welche zum austausch von Daten zwischen verschiedenen Applikationen dient.

Hier zwei Bsp. die fast die gleiche XML-Datei zulassen.
Welche ist besser:

Eine flache Hierarchie


  <xs:element name="options1">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="main" type="main-type"/>        
        <xs:element name="remote" type="remote-type"/>        
        <xs:element name="db" type="db-type"/>        
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:complexType name="main-type">
    <xs:sequence>
      <xs:element name="modelname" type="xs:string"/>      
      <xs:element name="modelpath" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="remote-type">
    <xs:sequence>
      <xs:element name="pc" type="xs:string"/>
      <xs:element name="weiter" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="db-type">
    <xs:sequence>
      <xs:element name="constring" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>

Oder eine tiefe Hierarchie


  <xs:element name="options2">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="main">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="modelname" type="xs:string"/>
              <xs:element name="modelpath" type="xs:string"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="remote">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="pc" type="xs:string"/>
              <xs:element name="weiter" type="xs:string"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="db">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="constring" type="xs:string"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

Die Elemente main db und remote haben weitere Complexe Typen bzw. weitere Hierarchie Stufen... diese habe ich aus Übersichtsgründen weggelassen.

DANKE

09.11.2006 - 10:49 Uhr

Du hast recht... so geht es...


private void button3_Click(object sender, EventArgs e)
        {
            Hashtable htWAussen = new Hashtable();
            Hashtable htWInnen1 = new Hashtable();
            Hashtable htWInnen2 = new Hashtable();

            Hashtable htRAussen = new Hashtable();
            Hashtable htRInnen1 = new Hashtable();
            Hashtable htRInnen2 = new Hashtable();

            htWAussen.Add(1, htWInnen1);
            htWAussen.Add(2, htWInnen2);

            MyClass mycl1 = new MyClass("Hallo", 1234);
            MyClass mycl2 = new MyClass("Test", 1234);

            htWInnen1.Add(1, mycl1);
            htWInnen1.Add(2, mycl2);

            htRAussen.Add(1, htRInnen1);
            htRAussen.Add(2, htRInnen2);

            htRInnen1.Add(1, ((Hashtable)htWAussen[1])[2]);


            ((MyClass)htWInnen1[2]).m_sText = "XYZ";

            System.Diagnostics.Debug.WriteLine("----HtWAussen----");
            this.readHtAussen(ref htWAussen);
            System.Diagnostics.Debug.WriteLine("----HtRAussen----");
            this.readHtAussen(ref htRAussen);
            System.Diagnostics.Debug.WriteLine("------ENDE------");
        }

        private void readHtAussen(ref Hashtable hta)
        {
            foreach (Hashtable hti in hta.Values)
            {
                foreach (MyClass myCls in hti.Values)
                {
                    System.Diagnostics.Debug.WriteLine(myCls.m_sText);
                }
            }
        }

        
        
    }
    public class MyClass
    {
        public string m_sText;
        public int m_nValue;
        public MyClass(string txt, int val)
        {
            m_nValue = val;
            m_sText = txt;
        }
    }

Ausgabe:


----HtWAussen----
XYZ
Hallo
----HtRAussen----
XYZ
------ENDE------

hab eigentlich gedacht, das ich in meinem richtigen prog es auch so gemacht habe...

... dann muss ich wohl noch mal schauen... ich melde mich dann noch mal falls es probleme gibt.

09.11.2006 - 09:52 Uhr

hallo herbivore...

danke für die schnelle Antwort. Das man in HTs nur Referenzen speichern kann ist mir schon klar gewesen:

Hier mal ein kleines Bsp was mein Problem vielleicht besser beschreibt:


 private void button3_Click(object sender, EventArgs e)
        {
            Hashtable htWAussen = new Hashtable();
            Hashtable htWInnen1 = new Hashtable();
            Hashtable htWInnen2 = new Hashtable();

            Hashtable htRAussen = new Hashtable();
            Hashtable htRInnen1 = new Hashtable();
            Hashtable htRInnen2 = new Hashtable();

            htWAussen.Add(1, htWInnen1);
            htWAussen.Add(2, htWInnen2);
           
            htWInnen1.Add(1, "Hallo");
            htWInnen1.Add(2, "Test");

            htRAussen.Add(1, htRInnen1);
            htRAussen.Add(2, htRInnen2);

            htRInnen1.Add(1, ((Hashtable)htWAussen[1])[2]); // Diese Zuordnung soll nur einmal gemacht werden.


            htWInnen1[2] = "XZY";

            System.Diagnostics.Debug.WriteLine("----HtWAussen----");
            this.readHtAussen(htWAussen);
            System.Diagnostics.Debug.WriteLine("----HtRAussen----");
            this.readHtAussen(htRAussen);
            System.Diagnostics.Debug.WriteLine("------ENDE------");
        }

        private void readHtAussen(Hashtable hta)
        {
            foreach (Hashtable hti in hta.Values)
            {
                foreach (string s in hti.Values)
                {
                    System.Diagnostics.Debug.WriteLine(s);
                }
            }
        }


Ausgabe:


----HtWAussen----
XZY
Hallo
----HtRAussen----
Test                         Wie schaffe ich es, das hier XZY steht?
------ENDE------

Wird mit dieser Zeile ein Kopie der Ht gemacht???


htRInnen1.Add(1, ((Hashtable)htWAussen[1])[2]);

Wie kann ich das umgehen???
So gehts ja leider nicht.


htRInnen1.Add(1,ref ((Hashtable)htWAussen[1])[2]);

Ich hoffe du hast mein Problem jetzt verstanden... falls nicht sag bescheid.

08.11.2006 - 18:13 Uhr

Hallo User...

folgendes Problem:

Kann ich in einer Hashtable eine Referenz auf ein anderes Objekt speichern?

Wie ich in C++ einen Pointer auf einen Wert habe.

So habe ich es verucht, geht aber nicht.

Hashtable htA (key,Wert);

Hashtable htB (key,ref auf Wert);

Ziel ist es das verschiedene Hashtables auf eine Hashtable zeigen sollen (da wo die Werte drin gespeichert sind). Wenn die Werte jetzt verändert werden sollen sich die Referenzen auf die Werte natürlich nicht ändern... und alle Hashtables zeigen wieder auf den richtigen Wert.

Wenn das nicht geht, wie kann ich sowas dann effizient programmieren.

Danke

28.06.2006 - 16:49 Uhr

Original von John444
Kann es irgendwie auch nicht testen, weil bir mir

System.Runtime.Remoting.Channels.BinaryClientFormatterSinkProvider  

schon nicht existiert... ist das nur in .Net 2.0 drin?
hmm in der msdn steht auch 1.1 🤔

Ok, das hab ich mir schon selber beantwortet.
man muss dafür die System.Runtime.Remoting.dll einfügen

28.06.2006 - 16:29 Uhr

ich hab zwar gefunden wie man das in die config Datei schreibt...

funktioniert aber auch nicht, gleiche Exception

hier die neue Config Datei. Vielleicht hab ich ja was falsch gemacht.



<?xml version="1.0" encoding="utf-8" ?> 
<configuration>
  <system.runtime.remoting>
    <application name="RemService">
      <channels>
        <channel ref="http" port="8991"/>
        <serverProviders>
			<formatter ref="binary" typeFilterLevel="Full" />
		</serverProviders>
      </channels>
      <client>
        <wellknown 
            type="RemService.ClsService, RemService" 
            url="http://localhost:8990/RemService/MySingleton.soap" 
         />
      </client>
    </application>
  </system.runtime.remoting>
</configuration>


28.06.2006 - 16:12 Uhr

Hi Lynix,

danke für die schnelle Hilfe.
So ganz verstehe ich es aber noch nicht.

Soll das was du da gespostet hast in den Client? Wie komme ich dann an mein B-Klasse Objekt?

Kann es irgendwie auch nicht testen, weil bir mir

System.Runtime.Remoting.Channels.BinaryClientFormatterSinkProvider

schon nicht existiert... ist das nur in .Net 2.0 drin?
hmm in der msdn steht auch 1.1 🤔

wenn du ein etwas ausführlicheres Bsp. mit Client / Server hättest wäre ich dir dankbar.

28.06.2006 - 13:48 Uhr

Hab hier mal ein Remoting Bsp gepostet.

Remote .Net Events Exception

Wenn du die Events weg lässt funktioniert es wunderbar.

28.06.2006 - 13:45 Uhr

Hallo User...

hab eine Client Server Anwendung mit .Net Remoting gebaut.
Habe auch ein Singleton Objekt was ich durch die gegend schicken kann... funktioniert alles wunderbar...

Jetzt will ich die ganze Sache noch um Events erweitern.
Da hänge ich...

Hier mein Prog.

Die Business Klasse: RemService.dll



using System;

namespace RemService
{
	public delegate void GetData();
	public class ClsService: MarshalByRefObject
	{
		private int myValue;
		public event GetData evtGetData;

		public int addValue(int add)
		{
			return this.myValue+=add;
		}
		public int getValue()
		{
			return this.myValue;
		}
		public void setValue(int x)
		{
			this.myValue = x;
			evtGetData();
		}
	}
}



Der Server hält die B-Klasse am leben RemServer.exe


...
RemotingConfiguration.Configure("RemServer.exe.config");
mySingletonRem = new ClsService();
this.txtInfo.Text = "Server is running...";
...

mySingletonRem.setValue(5); //In dieser Fkt wird der Event ausgelöst

Die RemServer.exe.config sieht so aus:


<?xml version="1.0" encoding="utf-8" ?> 
<configuration>
	<system.runtime.remoting>
		<application name="RemService">
			<channels>
				<channel ref="http" port="8990"/>
			</channels>
			<service>
				<wellknown
					mode="Singleton"
					type="RemService.ClsService, RemService"
					objectUri="MySingleton.soap"
				/>
			</service>
		</application>
	</system.runtime.remoting>
</configuration>

Der Client: RemClient.exe


public void cmdConnect_Click(object sender, System.EventArgs e)
		{
			
			RemotingConfiguration.Configure("RemClient.exe.config");
			
			mySingletonRem = new ClsService();
			
			txtInfo.Text = "Client connect...";
			int a = mySingletonRem.addValue(1); //Funktioniert super auch bei vielen Clients.
			
			try
			{
				mySingletonRem.evtGetData += new GetData(this.ReceiveData); // Hier kommt die Exception siehe unten
			}
			catch (Exception exp)
			{
				MessageBox.Show (exp.ToString() + exp.Message);
				this.Close();
			}

			this.cmdConnect.Enabled = false;
		}
		
		public void ReceiveData()
		{
			txtData.Text = mySingletonRem.getValue().ToString();
		}

Die RemClient.exe.config sieht so aus



<?xml version="1.0" encoding="utf-8" ?> 
<configuration>
  <system.runtime.remoting>
    <application name="RemService">
      <channels>
        <channel ref="http" port="8991"/>
      </channels>
      <client>
        <wellknown 
            type="RemService.ClsService, RemService" 
            url="http://localhost:8990/RemService/MySingleton.soap" 
         />
      </client>
    </application>
  </system.runtime.remoting>
</configuration>


Folgende Exception kommt beim andocken an das Event.


System.Security.SecurityException: Type System.DelegateSerializationHolder and the types derived from it (such as System.DelegateSerializationHolder) are not permitted to be deserialized at this security level.

Server stack trace: 
   at System.Runtime.Serialization.FormatterServices.CheckTypeSecurity(Type t, TypeFilterLevel securityLevel)
   at System.Runtime.Serialization.Formatters.Soap.ObjectReader.CheckSecurity(ParseRecord pr)
   at System.Runtime.Serialization.Formatters.Soap.ObjectReader.ParseObject(ParseRecord pr)
   at System.Runtime.Serialization.Formatters.Soap.ObjectReader.Parse(ParseRecord pr)
   at System.Runtime.Serialization.Formatters.Soap.SoapHandler.StartChildren()
   at System.Runtime.Serialization.Formatters.Soap.SoapParser.ParseXml()
   at System.Runtime.Serialization.Formatters.Soap.SoapParser.Run()
   at System.Runtime.Serialization.Formatters.Soap.ObjectReader.Deserialize(HeaderHandler handler, ISerParser serParser)
   at System.Runtime.Serialization.Formatters.Soap.SoapFormatter.Deserialize(Stream serializationStream, HeaderHandler handler)
   at System.Runtime.Remoting.Channels.CoreChannel.DeserializeSoapRequestMessage(Stream inputStream, Header[] h, Boolean bStrictBinding, TypeFilterLevel securityLevel)
   at System.Runtime.Remoting.Channels.SoapServerFormatterSink.ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, IMessage& responseMsg, ITransportHeaders& responseHeaders, Stream& responseStream)

Exception rethrown at [0]: 
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at RemService.ClsService.add_evtGetData(GetData value)
   at RemClient.frmClient.cmdConnect_Click(Object sender, EventArgs e) in d:\data\src\test\remclient\frmclient.cs:line 134Type System.DelegateSerializationHolder and the types derived from it (such as System.DelegateSerializationHolder) are not permitted to be deserialized at this security level.


Bin über jede Hilfe dankbar.

Der oben stehende Code kann auch gut als einfaches Remoting Bsp genutzt werden. Das funktioniert ja...

23.06.2006 - 16:47 Uhr

ja richtig wollte ein com server bauen.

hab die dll übers VS Studio registiert.

Steht auch in der Reg drin, hab ich schon kontrolliert.

23.06.2006 - 16:08 Uhr

Schade bisher noch keine Antwort.

Habt ihr vielleicht ne andere Lsg. für so ein Konzept?

Mein Server Programm soll halt im System liegen. Verschiedene Clients sollen sich anmelden können und auf Events reagieren. Es sollen relativ viele (große) Daten über diese Schnittstelle verschickt werden. Bzw. Eventgest. sollen sich die Clients die entsprechenden Daten holen.

Wie macht man das am besten?

Ist mein Ansatz mit dem GetActiveObject überhaupt richtig.

Dafür muss es doch irgendwas gutes geben...

22.06.2006 - 13:31 Uhr

Hallo User.

Ich will ne DLL bauen die als lokaler Server läuft.

Wenn sie noch nicht läuft wird sie halt vom Client gestartet.

Mein Server sieht so aus. (das mit dem IF ist nur ein test)


using System;
using System.Runtime.InteropServices;

namespace DBDLLTest
{
	[Guid("E9C9FB78-1810-46e1-BB9F-BB293C7E2A73")]
	[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
	public interface _Numbers
	{
		[DispId(1)]
		int Test(int a);
	}

	[Guid("2E0764E9-1FD4-4eb2-85E7-E59DA16D3529")]
	[ClassInterface(ClassInterfaceType.None)]
	[ProgId("DBDLLTest.Numbers")]
	public class Numbers : _Numbers
	{
		private int cnt;
		public Numbers()
		{
			cnt = 0;
		}
		public int Test(int a)
		{
			cnt += a;
			return(cnt); 
		}
	}
}

Client



DBDLLTest.Numbers tmp;
			try
			{

				tmp = (DBDLLTest.Numbers)Marshal.GetActiveObject("DBDLLTest.Numbers");
			}
			catch (Exception exp)
			{
				tmp = new DBDLLTest.Numbers();
			}

Bei der Exception kommt dann: Vorgang nicht verfügbar

Hat einer eine Idee, bin ich überhaupt auf dem richtigen Weg?
Wie kann man sowas vielleicht besser machen?
Bin über jede Hilfe dankbar.

Gruß

22.03.2006 - 09:51 Uhr

Das ist natürlich nicht die Antwort die ich hören wollte.

Es ist aber eine Windows Forms - Anwendung.

Welche Technik steckt denn hinter diesen Windows-Messages?
Hast du da vielleicht ein Bsp. oder bestimmte Begriffe wo ich nach suchen kann?

Thx

21.03.2006 - 15:35 Uhr

Hallo Forumusr.

Hat einer vielleicht ein gutes Bsp. in dem erklärt ist wie ich von C++ aus C# Funktionen benutze?

Ich hab ein C++ Programm von dem aus ich Daten zu einem C# Programm senden will. Im C# Programm werden diese dann weiter verwendet.

Es handelt sich um Unmanaged C++ Code.

Danke für Eure Hilfe.

22.02.2006 - 13:22 Uhr

jo stimmt...

so ist es schöner

22.02.2006 - 10:38 Uhr

Danke...

KeyDown funktioniert.

Falls es noch einen interessiert:



private void lstStencil_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
	if (e.KeyValue == 46)
	{
		this.lstStencil.Items.Remove(this.lstStencil.SelectedItem);
	}
}


22.02.2006 - 10:28 Uhr

Welches Event muss ich benutzen um bei einer Listbox mit dem Enft-Button einen selektierten Eintrag zu löschen?

Wenn ich Key_Press benutze hab ich e.KeyChar zur Verfügung, damit kann ich dann nach einem bestimmten Buchstaben abfragen...

Ich kann z.B mit der Taste "l" einen Eintrag löschen...


private void lstStencil_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
	if (e.KeyChar.ToString() == "l")
	{
		this.lstStencil.Items.Remove(lstStencil.SelectedItem);
	}
}

wie funktioniert das mit der "Entf" Taste?

Danke

22.02.2006 - 10:13 Uhr

Ich hab folgendes Problem:

Ich benutze VS 2003 als Entwicklungsumgebung.

Ich möchte eine Word Datei, die im Projekt Ordner liegt beim kompilieren in das entsprechende Verzeichnis (Debug / Release) kopieren.

Dazu hab ich in den Projekt Properties unter Common Properties --> Build Events --> Post-build Event Command Line folgendes Makro geschrieben.

copy $(ProjectDir)Help.doc $(ProjectDir)$(OutDir)

funktioniert soweit auch schon ganz gut.
Das Problem ist nur das jetzt im Debug / Release Verzeichnis eine Batch Datei mit dem Namen: "PostBuildEvent.bat" erstellt wird.
Diese stört mich...

Gibt es vielleicht noch einen besseren Weg eine Datei hinzuzufügen ohne das die .bat Datei im Debug / Release Verzeichnis existiert?

Im Release Verzeichnis sollten meiner Meinung nach nur die für das Projekt erforderlichen Dateien liegen... und nicht irgendwelche .bat Dateien, die beim kopieren des Release Verzeichnisses eh nicht mehr funktionieren...

Danke

02.02.2006 - 17:36 Uhr

Danke für den Hinweis,

dass war mir so nicht klar.

Hab gedacht man könnte da noch irgendwie selber was tricksen.

02.02.2006 - 15:42 Uhr

Die TreeViewgröße ist nicht mein Problem.

Den TreeView lese ich ja am Anfang komplett ein, dass ist auch gut so, wird auch nicht zu groß.

Wenn ich dann die Daten benötige lese ich diese aus der Datei aus und speicher die im TreeView. Jetzt will ich die beim löschen eines TreeViews auch direkt wieder im Ram löschen und nicht warten bis das irgendwann mal der Garbage Collector macht.

gibt es da ne Möglichkeit?

Hab gerade mal mit IDisposable gespielt, das hat aber nocht nicht geklappt.

02.02.2006 - 10:32 Uhr

Hallo Forumusr.

Mein Programm:
Ich lese Simulationsdateien in einen TreeView ein, Anfangs nur den Kopf. Im Kopf der Dateien stehen Informationen wie Variablennamen, also nur ein paar KB. Kein Problem. Wenn der Benutzer dann eine bestimmte Datei visualisieren will, wird diese komplett ausgelesen und die Daten werden im TreeView gehalten, also auch im Ram.
Soweit funktioniert auch alles, das prinzipielle Konzept soll auch so erhalten bleiben.

Jetzt zu den Fragen:

  1. Ich würde gerne eine grenze für den Speicher angeben.
    z.B. 500MB. Falls diese Marke überschritten wird, sollen die Daten wieder gelöscht werden.

  2. So kommen wir zum 2. Problem, wie lösche ich diese Daten wieder?
    Dieses Problem hab ich auch beim entfernen eines TreeViews.
    Wenn eine Datei aus dem TreeView gelöscht wird (vom Usr) dann möchte ich, dass die vorher eingelesenen Daten aus dem Ram gelöscht werden.
    Momentan lösche ich einfach nur den obersten zweig.

this.treeView1.Nodes.Remove(treeView1.SelectedNode);

Wie gehe ich an so was ran, muss ich da mit dem Garbage Collector hantieren.
Für Vorschläge bin ich Euch dankbar.

Oder sollte man da die Finger von lassen, weil bei C# eh alles automatisch wieder aufgeräumt wird. (Leider erst wenn das Programm geschlossen wird) Damit wäre ich aber irgendwie nicht zufrieden. Ich muss doch Objekte wieder aus dem Speicher nehmen können.

06.12.2005 - 10:40 Uhr

Danke für die Hilfe,
den Code hab ich genau so wie sheitman, hab nur noch einen kleinen Zusatz dahinter gesetzt:
Wenn der Wert nicht im Array vorkommt, nimmt er den letzten.
Aber das ist auch wieder was spezielles.

Hab nur gedacht, es würde da vielleicht was schnelleres geben, mit der BinarySearch oder so.

Ciao

06.12.2005 - 09:58 Uhr

Hallo,

ich habe ein aufsteigend sortiertes Array.
Bsp: 0, 10, 20, 30, ...
Gibt es eine fertige Funktion die mir den index des nächstliegenden Eintrages findet?
z.B bei 9 soll er die 10 finden, also index=1 liefern?
BinarySearch liefert leider ne -1.

Danke

02.12.2005 - 20:24 Uhr

werde das am Mo. mal versuchen.

Danke für die Hilfe

02.12.2005 - 15:51 Uhr

schon mal danke für die schnelle antwort.

hab jetzt alles in nem 1D Feld drin.

Wie bekomme ich jetzt genau das 1D Feld an die DLL geschickt.

so sieht die dll funktion aus:


[DllImport("mydll.dll")]
static extern int avSendData(int rows,int cols,double[] data);

so meine funktion


int ret = avSendData(rows,cols,1DFeld);

was muss ich da jetzt genau mit der Marshal Funktion machen?
Ein MarshallAs.LpArray gibt es bei mir nicht?
nur, Marshal, MarshalAsAttribute, MarshalBy..., usw. keine hat eine LpArray Methode

Danke

02.12.2005 - 15:18 Uhr

Hallo...

ich habe eine externe DLL (kleines C++ Programm (Unmanaged) ) in meinem C# Projekt integriert.
Klappt auch soweit ganz gut, jetzt das Problem.

Wie übergebe ich ein 2 Dimensionales double Array (double[][] tmp) an die DLL Funktion.

Ich bekomme folgende Exception:
System.Runtime.InteropServices.MarshalDirectiveException

Additional information: Can not marshal parameter #3: Invalid managed/unmanaged type combination (Arrays can only be marshaled as Array or SafeArray).

Jetzt zur Frage:
Wie erstelle ich ein SafeArray in C#, wie ich es in C++ wieder auslese müsste ich eigentlich hinbekommen.

Schon mal danke für die mühen.

01.12.2005 - 09:25 Uhr

Bin fast soweit es selber zu machen....

Hab da auch schon an OpenGl gedacht.

Ich werde mir die Bsp mal anschauen.

Danke

30.11.2005 - 13:36 Uhr

ja, an gnuplot hab ich auch schon gedacht.

Ein Problem sind, dass ich keine verdeckten Flächen sehen kann, weil ich es nicht interaktiv drehen kann.

Soweit ich weiß, kann ich es auch nicht direkt in .net einbinden, als ocx oder so.
Weiß ich aber nicht genau, wenn das geht, wäre das auf jeden Fall eine Möglichkeit.

Vieleicht hat ja einer ein .NET Gnuplot Bsp.

Danke.

30.11.2005 - 12:09 Uhr

ich denke das MSGraph nicht ausreicht.

Ich geb mal ein Bsp:

Stellt euch vor, dass z.B. ein Heizstab visualisiert werden soll.
Zu unterschiedlichen Zeiten in einer Fläche unterschl. Temperaturen.

Es sind also echte 3D Daten, ihr könnt euch auch irgend ein Gebirge vorstellen.

Der User soll nachher die mögl. haben das ganze auch zu drehen und zoomen...

Kostenlos muss es nicht unbedingt sein, sollte halt ne Demo oder ne Trial existieren.

Aber schon mal danke für die schnelle Hilfe

30.11.2005 - 11:30 Uhr

Hallo,

ich suche eine Komponente (die ich in C# .Net) einbinden kann die mir 3Dim Werte zeichnen kann.

Ein kurzer Einblick ins Programm:
Ich schreibe ein Programm, welches Messdaten aus einem File ausliest und diese dann visualisiert. Für 2 Dimensionale Zeichnungen benutze ich den TrendViewer, klappt auch alles wunderbar.

Jetzt suche ich eine Control welches auch 3 Dimensionale Werte visualisieren kann, hab da z.B den Intel Array Visualizer gefunden. Hab aber leider keine Demo gefunden. Es kommen nur LicenseExceptions

Kennt einer ein gutes Programm, welches sich gut in C# einbinden lässt und falls möglich sogar kostenlos ist, falls nicht muss eine Demo existieren.

Danke für Eure Hilfe

P.S Bin ich überhaupt im richtigen Forum