Ich habe zwei Apps. Einer von ihnen ist in Visual C++ geschrieben und der andere ist eine Unity App, beide laufen auf Windows. In meinem Szenario möchte ich eine Einheitsfunktion aufrufen und ein Objekt zeichnen, wenn der Benutzer auf eine Schaltfläche in meiner C++ App drückt. Bisher habe ich versucht, die Einheit ausführbar in den gleichen Adressraum mit der C++ App zu laden, indem Sie mono_domain_assembly_open
aufrufen. Es gibt jedoch immer Null zurück und ich kann mono_jit_exec
nicht aufrufen, um die Unity-App auszuführen. Ist es möglich, die Zweiwegkommunikation zwischen diesen beiden Anwendungen mit Mono aufrechtzuerhalten? Vielen Dank im Voraus!Zwei-Wege-Kommunikation zwischen unmanaged Code und Unity3D-Code
Antwort
Hier ist ein altes Beispiel, basierend auf this post. Sie möchten Ihren C# -Delegaten als Funktionszeiger an C++ übergeben. Sie können diesen Funktionszeiger für die Verwendung durch Ihre Schaltfläche oder was auch immer Sie möchten, speichern.
C++ DLL:
typedef int (__stdcall *UnityCallback)(int);
static UnityCallback gCallBack;
extern "C" __declspec(dllexport)
inline int CallbackExample(UnityCallback unityFunctionPointer, int n)
{
gCallBack = unityFunctionPointer;
if(gCallBack)
{
return gCallBack(n);
}
return 0;
}
C# Anrufer:
using UnityEngine;
using System;
using System.Runtime.InteropServices;
public class Callback : MonoBehaviour {
public delegate int CallbackDelegate(int n);
[DllImport ("UnityPluginCallback")]
private static extern int CallbackExample(CallbackDelegate fp, int n);
void Awake()
{
int result = CallbackExample(new CallbackDelegate(this.CallbackTest), 42);
Debug.Log("Result from callback, should be 43: " + result);
}
int CallbackTest(int n)
{
Debug.Log("Received: " + n + " from C++ dll");
return n+1;
}
}
In meinem Beispiel die C++ DLL ruft sofort den C# Rückruf mit einem Wert von 42 C# 's Callback-Schritten dieser Wert um 1 und gibt es an C++ zurück, das es wiederum an C# an der Aufrufseite zurückgibt.
Unity mag es nicht, wenn Sie versuchen, auf die Engine außerhalb des Hauptthreads zuzugreifen, daher bin ich mir nicht sicher, was passiert, wenn Ihre C++ DLL asynchrone Aufrufe an C# zurückgibt. In meinem Beispiel beginnen die Aufrufe im Haupteinheits-Thread, so dass es keine Probleme gibt. Ich würde vorschlagen, dass Sie keine Unity-spezifische Funktionalität im C# -Rückruf zulassen, stattdessen verwenden Sie den Rückruf, um einen booleschen (oder einen anderen Mechanismus) festzulegen, der von Update
verwendet werden kann, um das von der Unity-Engine gewünschte zu implementieren.
- 1. Pipe, Fork und Exec - Zweiwegekommunikation zwischen Eltern- und Kindprozess
- 2. unmanaged DLL-Code
- 3. Unmanaged Code aufrufen vb.net Rückruf
- 4. Marshalling unmanaged Code in Silverlight
- 5. Callback unmanaged code aus verwaltet C#
- 6. C# unverifiable Code ohne unmanaged Erlaubnis
- 7. Marshal Unmanaged Struktur zu verwaltetem Code mit C#
- 8. Konnte der verwaltete Code (speziell .NET) jemals 'unmanaged' werden?
- 9. jpa merge unmanaged entity
- 10. Dumpdata mit unmanaged Modellen
- 11. RXTX serielle Zweiwegekommunikation sendet keine Daten nach dem ersten Lauf
- 12. C++/cli erkennt Übergänge zwischen verwaltet/unmanaged und ihre Kosten zu messen
- 13. Autowiring Unmanaged Beans mit @ Komponent
- 14. Zuordnung "unmanaged" Speicher in C#
- 15. Autowiring für Frühling unmanaged Objekt
- 16. Swift UnsafeMutablePointer <Unmanaged ?> Zuordnung und Drucken
- 17. Unterschied zwischen Objektreferenz und Object-Hash-Code
- 18. Code-Kompatibilität zwischen OCaml und F #
- 19. Freigabe von Code zwischen NSDocument und UIDocument
- 20. DRY zwischen Produktion und Test Code Konstanten
- 21. Freigabe von Code und Schema zwischen Microservices
- 22. Diskrepanz zwischen Kommandozeile XRandR und eigenem Code
- 23. Wie erstelle ich Rückrufe zwischen Android-Code und nativem Code?
- 24. Merge unmanaged und DLLs in einzelne DLL in DotNet verwaltet
- 25. Unmanaged C# ruft eine statische Bibliothek auf
- 26. expose unmanaged C++ - Klassenbibliothek zu C#
- 27. Getting in unmanaged C++ - Funktionen von C#
- 28. Aufruf von unmanaged Funktion char char *
- 29. Share code zwischen Fragmenten
- 30. Sharing-Code zwischen Microservices