Frage

Ich versuche meine Optionen zu verstehen, um eine C# -Bibliotheksimplementierung aus nicht verwaltetem C ++ anzurufen.

Mein Top -Level -Modul ist eine nicht verwaltete C ++ COM/ATL -DLL. Ich möchte die Funktionalität eines vorhandenen verwalteten C# DLL integrieren. Ich habe und kann die Quelle für beide Bibliotheken neu kompilieren.

Ich verstehe aus dem Lesen von Artikeln wie Diese Übersicht auf msdn und Diese Frage Es kann möglich sein, einen "Mixed-Mode" -DLL zu erstellen, mit dem der native C ++-Code in die C# -Bibliothek aufgerufen werden kann.

Ich habe ein paar Fragen zu diesem Ansatz:

  1. Wie mache ich das ein? Kann ich einfach einige Eigenschaften für das vorhandene COM/ATL -Projekt ändern, um die C# -Module zu verwenden?
  2. Wie werden diese Mixed-Mode-Aufrufe in der Leistung von COM Interop-Aufrufen unterscheiden? Gibt es ein gemeinsames String -Format, mit dem möglicherweise Umwandlung oder tiefe Kopien zwischen den Modulen verhindern?
  3. Wenn diese DLL gemischtem Mode erstellt wird, kann sie nach seinen COM-Clients immer noch miteinander verbunden/verwendet werden, oder müssen sie gemischtem Modus bewusst sein?
  4. Wird die Einbeziehung des CLR beim Laden dieses COM -Objekts erhebliche Aufwand auferlegen?

Ich bin neu in der Windows -Entwicklung. Bitte kommentieren Sie also, ob in der Frage Erklärung etwas Klarstellung oder Korrektur erfordert.

Danke im Voraus.

War es hilfreich?

Lösung

Wie mache ich das ein? Kann ich einfach einige Eigenschaften für das vorhandene COM/ATL -Projekt ändern, um die C# -Module zu verwenden?

Wenn Sie dieses Projekt vollständig kontrollieren, ist das Ändern solcher Einstellungen kein Problem, dann sicher. Alles was Sie brauchen ist zu aktivieren /clr Für dieses Projekt (in Projekteigenschaften, öffnen Sie die "allgemeine" Seite und suchen Sie nach Unterstützung der "gemeinsamen Sprachlaufzeit"). Jetzt können Sie verwaltete Griffe verwenden (^) und andere C ++/Cli -Bits in Ihrem Projekt nach Bedarf. Alle in einfachen C ++ geschriebenen Code sollten einfach weiter funktionieren (er wird jetzt wie möglich mit MSIL zusammengestellt, aber seine Semantik bleibt unverändert).

Wie werden diese Mixed-Mode-Aufrufe in der Leistung von COM Interop-Aufrufen unterscheiden? Gibt es ein gemeinsames String -Format, mit dem möglicherweise Umwandlung oder tiefe Kopien zwischen den Modulen verhindern?

Ein Mixed-Mode-Aufruf wird schneller sein, da er schneller aufgerufene Konventionen verwendet und die Art und Weise, wie COM Interop tut, keine Marschallung durchführt (Sie verwenden entweder Typen, die von Natur aus kompatibel sind oder Ihre eigenen expliziten Conversions durchführen).

Es gibt kein gemeinsames Zeichenfolgenformat - das Problem ist das System::String Beide Zuordnungen und besitzen seinen Puffer und verlangt auch, dass er unveränderlich ist. Sie können also nicht selbst einen Puffer erstellen und ihn dann als umwickeln String, oder erstellen a String und verwenden Sie es dann als Puffer, um Text auszugeben.

Wenn diese DLL gemischtem Mode erstellt wird, kann sie nach seinen COM-Clients immer noch miteinander verbunden/verwendet werden, oder müssen sie gemischtem Modus bewusst sein?

Es kann gleichzeitig miteinander verbunden werden, aber wenn es über einen nativen Einstiegspunkt eingegeben wird, wird versucht, die CLR in den Prozess zu laden, es sei denn, man ist bereits geladen. Wenn der anrufende Client bereits vor dem Anruf CLR geladen hatte (oder der Client selbst aus dem verwalteten Code genannt wurde), erhalten Sie die bereits geladene CLR, die sich von der CLR unterscheidet, die Ihr Code benötigt (z. B. Client Kann 1.1 geladen haben und Ihr Code 2.0 benötigt).

Wird die Einbeziehung des CLR beim Laden dieses COM -Objekts erhebliche Aufwand auferlegen?

Es hängt davon ab, was Sie durch Overhead definieren. Codegröße? Laufzeitstrafen? Speicherpfunddruck?

Das Laden des CLR bedeutet auf jeden Fall, dass Sie alle GC- und JIT -Maschinen erhalten. Die sind nicht billig. Das heißt, wenn Sie den Managed Code letztendlich sowieso anrufen müssen, gibt es keine Möglichkeit - Sie werden es tun haben CLR in einen Prozess laden, um dies zu tun. Die Strafen werden zwischen COM Interop und Mixed-Mode C ++/CLI-Baugruppen nicht unterschiedlich sein.

Andere Tipps

Ich kann nicht viel über die Details wie die String -Probleme sagen, da ich diesen Ansatz nie aktiv verwendet habe.

Sie können jedoch problemlos jede COM -Schnittstelle aus einem C# -Codus konsumieren, indem Sie einfach einen VS -Assistenten für Sie erstellen lassen.

In der anderen Richtung müssen Sie nur Ihre C# -Anbaugruppen einstellen ' ComVisibleAttribute Zu True (in vs ist es ein einfaches Kontrollkästchen in den Projekteigenschaften), und dann erstellt der Compiler automatisch COM -Schnittstellen für Sie. Auch hier gibt es keine zusätzliche Leistungsstrafe.

HTH!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top