Die Frage ist klar, wie sein eigenen C++ Code zu seiner C# Lösung zu integrieren, nicht nur, was verwenden, um Attribut eine vorhandene Funktion von der Win32-API aufrufen. Selbst wenn die Antwort bereits akzeptiert wurde, denke ich, dass sie unvollständig ist, und Folgendes sollte zutreffen.
Ja, das ist in den Fällen üblich, in denen die Task schneller ausgeführt werden kann, weniger Ressourcen benötigt und in einigen Fällen auch auf Methoden zugreifen kann, die im .NET-Framework nicht verfügbar sind.
Wenn Ihr Ziel ist die Effizienz zu gewinnen ist es, Ihnen eine native unmanaged C++ Bibliothek codieren müssen, werden Sie einen neuen unmanaged C++ Projekt erstellen (das kompiliert als DLL-Bibliothek) in Visual Studio und Referenz diese Bibliothek von Ihrem C# -Projekt .
In Ihrem Fall scheint es, dass Sie eine nicht verwaltete C++ - Bibliothek schreiben, und Folgendes gilt.
Für alle unmittelbaren Probleme, die Sie über stellten, würde es Auswirkungen auf die Bereitstellung und die Verschleierung haben.
Bereitstellung: Beachten Sie, dass die C# DLLs Sie bauen auf jedem CPU laufen, beide 32 und 64-Bit, aber diese neue nativen und nicht verwaltete C++ Bibliothek Ihr Programm zwingen, entweder für 32 oder 64 spezifisch.
Dies ist etwas, das Sie in Ihrem Visual Studio Configuration Manager konfigurieren, und wird bei der Kompilierung Zeit betreut werden, werden Sie AnyCPU für C# Baugruppen und für die neue unmanaged C++ Bibliothek, holen, die in sein Es ist ein eigenes Projekt, Sie werden haben, um von Win32 oder X64 zu wählen.
So werden Sie jetzt 2-Setups haben, ist es Best Practice empfohlen getrennte Setups zu haben, eine für 32 und eine andere für 64 oder da 32bit Unterstützung sehr schnell sinkt, Sie auf 64bit konzentrieren konnte nur.
Auch Ihre Bibliothek verweist möglicherweise auf die von Visual Studio zur Verfügung gestellte VC++ redistibutable, die Sie möglicherweise in Ihre Implementierung einbeziehen müssen. Obwohl einige Versionen auf vielen Betriebssystemen enthalten sind, habe ich festgestellt, dass sie selten dieselbe ist mit und es ist am besten, es mit Ihrer Anwendung bereitzustellen, um sicher zu sein. Wenn dieses Paket fehlt, verfügt der Zielcomputer im Eventviewer-> Anwendungsprotokoll über eine SideBySide-Ausnahme.
Um eine Ausnahme zu erfassen und zu behandeln, die aus nicht verwaltetem Code ausgelöst wird, ist der einzige Catch, der funktioniert, der leere, der ohne Ausnahme in der Klammer nach catch(). Sie können also Ihre Aufrufe in nicht verwalteten Code einbinden, um alle nicht verwalteten Ausnahmen zu behandeln, die aus dem nicht verwalteten Code stammen. Wenn Sie einen .net-Typ wie catch (Exception) setzen, springt er einfach darüber. Die einzige Möglichkeit, eine nicht verwaltete Ausnahme abzufangen, befindet sich in verwaltetem Code in diesem Format.
try
{
//call unmanaged code
}
catch
{
//handle unmanaged exception
}
- Obfuscation: Alle Methodenaufrufe von C# getan, die jetzt nicht verwalteten Code aufrufen wird nun von Umbenennung automatisch ausgeschlossen werden. Und auf der anderen Seite, , wenn Ihr nicht verwaltete C++ Bibliothek braucht Methoden aufrufen von Ihrer verwalteten Baugruppen, müssen diejenigen von Umbenennung ausgeschlossen werden, manuell, um sichtbar für die C++ Bibliothek zu rufen sie.
Wenn das, was Sie brauchen nur gut bekannte C++ Bibliotheken wie die Windows-diejenigen zu nennen ist, werden Sie nicht ein neuen unmanaged C++ Projekt erstellen müssen, nur mit den Tasten [DllImport()] in einer früheren Antwort vorgeschlagen Attribut. Und in diesem Fall können Sie bei dieser Referenz einen Blick http://www.pinvoke.net/
Ist das Werbung für .NET? Wie steht es um plattformübergreifende Kompatibilität, Verbindungsprobleme, Lernkurve usw.? –
Lernkurve? Ich nehme an, Sie kennen die Grundlagen von C++ und C#, wenn Sie versuchen, Sprachen zu kombinieren. Plattform überqueren? Es ist offensichtlich, plattformübergreifenden Code in C++ zu schreiben ist viel schwieriger, aber möglich. Scheint sogar ein wenig einfacher, wenn es mit C# kombiniert wird - ein höherer Code kann entscheiden, welche C/C++ - Teile auf einer bestimmten Plattform geladen und verwendet werden sollen. – Harry
@Harry: Ich werde deine Antwort akzeptieren, wenn du mir zeigst (z. B. C# an einem PIC arbeitest ;-) –