Welche Situationen sind für C # bis C Interop geeignet?

8

Gibt unsafees Situationen, in denen die Zusammenarbeit mit C-Bibliotheken angesichts des Schlüsselworts C # immer noch von Vorteil ist?

Ich konnte die Notwendigkeit einer sehr schnellen Zahlenverarbeitung, grafischen Manipulation oder Matrixoperationen unter Verwendung bereits vorhandener C-Bibliotheken erkennen. Aber gibt es einen Anwendungsfall, um Greenfield-DLLs beispielsweise in C99 zu schreiben und von C # aus mit ihnen zusammenzuarbeiten?

Ich stelle mir vor, dass es Randfälle geben könnte, in denen ein Absenken auf C (in dem Sinne, dass es näher am Metall liegt) der einzige Weg wäre, die erforderlichen Leistungsmerkmale zu erhalten.

Robert Harvey
quelle
Wie hängt das mit C99 zusammen? Insbesondere, wenn Sie C # verwenden, verwenden Sie wahrscheinlich Visual Studio, das von AFAIK nicht unterstützt wird.
Svick
Aus diesem Grund habe ich teilweise C99 angegeben. Die Gründe müssen überzeugend genug sein, damit ich einen neuen Compiler dazu bekomme, und VS hat sowieso bereits C ++.
Robert Harvey

Antworten:

4

Es gibt ein paar Dinge, die C über C # hat.

Kann mit C Echtzeitcode erstellen. Nicht, dass Windows die beste Plattform dafür ist. Aber ich habe Echtzeit-Steuerungssysteme damit gemacht. Es wäre schön, dies in C # zu tun, und meistens ist es vorhersehbar, aber nicht immer, und das ist ein Killer für RT-Systeme.

Portabilität von C-Code über eine Reihe von Plattformen (nicht nur Linux / Windows, sondern eine beliebige Anzahl eingebetteter Systeme). Ich verwende Dinge wie Verschlüsselung und Komprimierung von Windows auf eingebettete Geräte, anstatt eine C- und C # -Version des Codes zu haben. Es ist einfacher, eine Bibliothek mit C # -Interop zu haben.

Keith Nicholas
quelle
Ah, im Grunde genommen erhalten Sie die vollständige Kontrolle über die Speicherzuweisung und -entsorgung (dh Sie müssen sich keine Gedanken über eine unbestimmte Speicherbereinigung machen). Aber es gibt Möglichkeiten, dieses Problem in C # zu moderieren, oder?
Robert Harvey
4
Sie haben im Grunde beschrieben, wann Sie C über C # verwenden würden. Aber das ist nicht die Frage, es geht um Interop, und Sie haben das nicht wirklich angesprochen, denke ich.
Svick
4

Erstens unsafeist es für viel mehr als C Interop nützlich. Beispielsweise kann die Bildanalyse mit tatsächlichen Pixeldaten im "sicheren" Modus schrecklich langsam sein. Das Umschalten in den unsicheren Modus und die gleiche Arbeit mit direktem Zugriff auf den Bildpuffer ist um eine Größenordnung schneller.

Eine umfassende Entwicklung in C / C ++ für die Aufnahme in ein .Net-Projekt kann durchaus sinnvoll sein, aber alles hängt von der Leistung ab. Der klassische Rat wäre, die gesamte Bewerbung in der Sprache Ihrer Wahl und dann im Profil zu schreiben. Wenn Sie einen kritischen Codeabschnitt finden, der mehr als 50% der Verarbeitungszeit benötigt und bei Verwendung einer verwalteten Sprache nicht mehr realistisch optimiert werden kann, implementieren Sie diese eine Routine erneut in C und integrieren Sie sie.

Ein Beispiel aus dem wirklichen Leben: Ich habe einen Prototyp für einen Pfadfindungsalgorithmus entwickelt. Nachdem ich gezeigt hatte, dass es mit C # funktioniert, musste ich es schnell genug machen, um viele Male pro Sekunde zu laufen. Ich hatte bereits eine nette Support-Benutzeroberfläche in C # erstellt, die alle für Routing-Entscheidungen verwendeten Faktoren, die Ergebnisse usw. zeigte. Deshalb habe ich den Kern des Routing-Algorithmus in C ++ neu implementiert. Wenn ich in C ++ angefangen hätte, bezweifle ich, dass ich so weit gekommen wäre.

Chris Pitman
quelle
2

Aber gibt es einen Anwendungsfall, um Greenfield-DLLs beispielsweise in C99 zu schreiben und von C # aus mit ihnen zusammenzuarbeiten?

Der Hauptanwendungsfall, den ich sehe, ist, wenn Sie eine spezielle Bibliothek schreiben, die für viele Plattformen vorgesehen ist, auf denen C oder C99 verfügbar ist, C # jedoch nicht oder nur für einige von ihnen ("C #" ist möglicherweise nicht für organisatorische Zwecke verfügbar Gründe, nicht nur rein technische).

Ein weiterer Anwendungsfall ist, wenn Sie einen Experten auf einem bestimmten Gebiet haben (z. B. einen Experten für eine bestimmte Hardware) und er die Aufgabe hat, einen Teil seines Expertenwissens in eine Bibliothek zu codieren. Dieser Experte verfügt jedoch über 30 Jahre Erfahrung in C. aber keine in C #.

Eines ist zu beachten: "100% grüne Wiese" ist heute eine sehr seltene Situation. Für die meisten Arten von Problemen gibt es zumindest Teillösungen oder ähnliche Lösungen, die bei Änderungen wiederverwendet werden können. Die Verwendung von C ist also sehr sinnvoll, wenn Sie auf einer vorhandenen C-Codebasis etwas Neues erstellen müssen.

Doc Brown
quelle
Für mich wären Greenfield-DLLs so etwas wie Ad-hoc-Gleichungen oder Transformationen, die in ein Echtzeitsystem eingebunden werden können. (die noch in C gemacht werden, wo ich arbeite).
Robert Harvey
@RobertHarvey - Ich denke, Sie könnten in Docs Antwort "Konsistenz" anstelle von "KMU kennt C" ersetzen und dieselbe Bedeutung haben. Und wie Keith in seiner Antwort angedeutet hat, möchten Sie, wenn Sie für ein hartes Echtzeitsystem schreiben, möglicherweise einfach die Zusicherungen, die eine C-Bibliothek bieten würde.
1

Ja, für die Anbindung an ältere Software. Ich musste eine Interop-DLL erstellen, die von meiner alten C-Anwendung verwendet werden konnte, um die Technologie zu nutzen, die bei der Erfindung meines Toolkits nicht verfügbar war.

Brian
quelle