Ich hab hier einen Out-Of-Process COM Server der in C# implementiert ist.
Dessen Type-Library erzeuge ich mit tlbexp.exe , was auch schön funktioniert.
Verwendung aus C++ Projekten heraus ist auch kein Problem, geht alles wunderbar.
Jetzt möchte ich diesen COM Server aus einem C# Projekt ansprechen. Naheliegend wäre einfach eine COM Referenz in das Projekt reinzuklicken bzw. tlbimp.exe zu verwenden.
Beide weigern sich aber mit der Fehlermeldung
The ActiveX type library 'XXX' was exported from a .NET assembly and cannot be added as a reference.
Visual Studio meint noch "hilfreicherweise"
Add a reference to the .NET assembly instead.
Mit ist klar was MS sich dabei gedacht hat, aber ... herrjeh, das ist ein Out-Of-Process COM Server, ich kann und will keine Referenz auf die .NET Assembly statt dessen verwenden.
Ich hab schon länger gesucht, finde aber keine Tips wie man das umgehen kann.
Schön wäre ein automatisierbarer Weg. Jedes mal von Hand an der TLB rumzufummeln oder aber handgeschriebene COM Import Klassen in einem C# Projekt zu pflegen ... darauf würde ich gerne verzichten.
Also. Weiss jemand wie man das hinbekommen kann?
EDIT: Grammatik
NullBockException schrieb:
frage ist, ob das besser bzw. performanter ist, Vorteil ich kann dann reflections um typen zu filtern etc.
Schneller als was? Als Reflection? Mir ist noch nicht wirklich klar, wie dein Typsystem bisher technisch funktioniert.
Auf jeden Fall wird die Performance von dynamisch kompiliertem Code kaum zu schlagen sein. Da kommt Reflection nicht ran. Außer, du machst quasi nichts mit deinen neuen Typen und brauchst sie nur ein mal, dann wär das natürlich eher kontraproduktiv.
Reflection ist an sich schon recht schnell in .NET. Ich hab früher einiges damit gemacht und es war einfach schnell genug, es war bisher nicht wirklich nötig, dynamisch Code zu generieren. Wenn dir die jetzige Performance deiner Lösung auch reicht, brauchst du das ja auch nicht verbessern. Außer zum Spass.
NullBockException schrieb:
Danke, aber das kenne ich:) ich meinte wie kann ich automatisch die Anzahl der Wellen zubereite erhöhen bzw. Verringern?
Wohl kaum. Ich kopier Dir mal ein Beispiel aus dem Wegener in XAML.
<PathGeometry>
<PathFigure StartPoint="100.50">
<QuardraticBezierSegment
Point1="300.100"
Point2="100.150" />
<!-- . oder , hängt von Kompilereinstellung ab -->
</PathFigure>
etc
ungetestet, auf Tablett getippt.
Jetzt brauchst Du nur die Punkte für Frequenz und Amplitude neu zu berechnen nach Abstand für die Segmente. Trivial ... Das war leicht im Netz zu finden.
Danke für die Antworten!
War mir garnicht bewusst das es in C# eine Preprozessor gibt, hab mit der Sprache nicht so viel am Hut gehabt - wobei sie mir super gefällt.
Ich habe hier einen Code der für Windows geschrieben ist - er macht einen DllImport auf Funktionen aus der Kernel32.dll . Ich möchte den Code unter Linux & Mono laufbar machen, dh. ich möchte den Windows Code bei Linux als Target durch äquivalenten Code ersetzen der aus der libc.so importiert.
Also scheint das mit dem Preprozessor der richtige Weg zu sein.
oenone schrieb:
Sicher, dass das Executable neu gebaut wurde? Evtl zwischen Debug und Release gewechselt?
Es stand nach wie vor auf Debug
Nunja, ich habe jetzt den gesamten Code per C&P in ein neues Projekt eingefügt und es funktioniert alles wie vorher.
Wäre das Problem soweit erstmal gelöst, aber interessieren tut mich dennoch:
Woran konnte das liegen? Hat das Projekt in dem der Fehler aufgetreten ist irgendeinen Schaden genommen?
Hallo Leute,
ich hab ein ItemsControl, welches Objecte von unterschiedlichen Typen enthält(haben eine gemeisame Basisklasse, was aber nich relevant ist)
Nun sind diese Klassen in eine Assembly in verschieden Namespaces vorhanden!
Die Möglichkeit Type eines Assembly via Reflection zu scannen ist klar, aber ich möchste nun auch DataTemplate welche jeweil zu den kontreten Klassen gehöhren in meinen DataTemplateSelector verwenden!
d.h. ich muss erst mal herrausfinden, welche Typen ich habe, und ob diese auch einen Datentemplate haben! wie mach ich das am besten!?
Grüße und Guten Abend
Das seh ich, da der inhalt nur in einem textblock angezeigt ist!
Die Fehlermneldung ist, dass das Property "MyText" nicht im DataContent Context vorhanden ist... was ja auch stimmt!
Ich dachte das ginge ohne probleme , jetzt muss ich den datenkontext rein verbiegen.. gefällt mir nich)
1. Ich öffne die Dateien mit dem OpenFileDialog
2. Zuweisung der Excel-Datei, Workbooks und Sheets mit Interop.Excel
3. Speichern der ersten Zeile als Titles[] (für ComboBox)
4. Durch if-Schleife wird (begonnen bei Zeile i=2) die "erste" Zeile der Daten, die durch die ComboBox zugewiesen wurde, mit einer Methode der Google API verarbeitet
5. In derselbigen if-Schleife werden die verarbeiteten Daten per StreamWriter in die neue csv.Datei in Zeile i geschrieben
EDIT: Das Video sieht interessant aus, ich versuche es mal damit, vielen Dank Bei Problemen melde ich mich nochmal^^
TBBox[] ToDo = new TBBox[nNode];
jetzt hast ein array welches "referenzen" sprich "pointer" in deinem fall vom typ TBBox enthält!
ToDo[0] = new TBBox(...);
erstellen ein Box object, und die referenz in dein array ablegen
.. psseude code.. nich getestet..
Also das ich der markupextension ein Bindung Objekt übergebe aber wie mach ich das? Da die markupextension nich von dependencyobjekt erbt, kann ich da auch kein dependencyproperty anlegen.. Das is mein Problem!?
Lösung?
Hallo,
in einem DataGridView habe ich einen DateTimePicker.
Dem Picker weise ich beim Load Event der Form folgendes zu:
dtpNeueBestellungLiefertermin = new DateTimePicker();
dtpNeueBestellungLiefertermin.Format = DateTimePickerFormat.Short;
dtpNeueBestellungLiefertermin.Visible = false;
dgNeueBestellungBestellpositionen.Controls.Add(dtpNeueBestellungLiefertermin);
dtpNeueBestellungLiefertermin.ValueChanged += this.dtpNeueBestellungLiefertermin_ValueChanged;
Beim Ändern des Wertes (Klick in die Zelle) erhalte ich die Fehlermeldung:
private void dgNeueBestellungBestellpositionen_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
try
{
if ((dgNeueBestellungBestellpositionen.Focused) && (dgNeueBestellungBestellpositionen.CurrentCell.ColumnIndex == 6))
{
dtpNeueBestellungLiefertermin.Location = dgNeueBestellungBestellpositionen.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false).Location;
dtpNeueBestellungLiefertermin.Visible = true;
if (dgNeueBestellungBestellpositionen.CurrentCell.Value != DBNull.Value)
{
dtpNeueBestellungLiefertermin.Value = (DateTime)dgNeueBestellungBestellpositionen.CurrentCell.Value; // hier wird die Fehlermeldung ausgelöst
}
else
{
dtpNeueBestellungLiefertermin.Value = DateTime.Today;
}
}
else
{
dtpNeueBestellungLiefertermin.Visible = false;
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
In der Zeile dtpNeueBestellungLiefertermin.Value = (DateTime)dgNeueBestellungBestellpositionen.CurrentCell.Value; kommt die Fehlermeldung.
Die Zeile im DataGridView fülle ich "von Hand":
string[] row0 = { "", bestellposition.ID, bestellposition.Bezeichnung, bestellposition.Nummer, bestellposition.Norm, bestellposition.Preis.ToString(), DateTime.Today.ToShortDateString() };
dgNeueBestellungBestellpositionen.Rows.Add(row0);
Übergebe ich das Datum falsch zum DataGridView?
Auch DateTime.Today.ToString("MM.mm.yyyy"); verursacht eine Fehlermeldung.