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
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.
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
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
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
@herbivore
hab die DLL jetzt in Applicationsverzeichnis gelegt und oh wunder ... alles funktioniert.
Danke.
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
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
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
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:
Danke
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
ich sollte also nur globale typen verwenden wenn ich sie auch wirklich häufiger brauche
sonst halt fall 2... richtig.
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
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.
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.
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
Original von John444
Kann es irgendwie auch nicht testen, weil bir mirSystem.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
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>
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.
Hab hier mal ein Remoting Bsp gepostet.
Wenn du die Events weg lässt funktioniert es wunderbar.
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...
ja richtig wollte ein com server bauen.
hab die dll übers VS Studio registiert.
Steht auch in der Reg drin, hab ich schon kontrolliert.
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...
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ß
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
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.
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);
}
}
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
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
Danke für den Hinweis,
dass war mir so nicht klar.
Hab gedacht man könnte da noch irgendwie selber was tricksen.
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.
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:
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.
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.
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
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
werde das am Mo. mal versuchen.
Danke für die Hilfe
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
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.
Bin fast soweit es selber zu machen....
Hab da auch schon an OpenGl gedacht.
Ich werde mir die Bsp mal anschauen.
Danke
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.
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
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