Ho due app. Uno di questi è scritto in visual C++ e l'altro è un'applicazione di unità, entrambi sono in esecuzione su Windows. Nel mio scenario, voglio chiamare una funzione di unità e disegnare un oggetto ogni volta che l'utente preme su un pulsante nella mia app C++. Finora, ho provato a caricare l'unità eseguibile nello stesso spazio indirizzo con l'app C++ chiamando mono_domain_assembly_open
. Tuttavia, restituisce sempre null e non sono in grado di chiamare mono_jit_exec
per eseguire l'app unity. È possibile mantenere una comunicazione bidirezionale tra queste due applicazioni usando mono? Grazie in anticipo!comunicazione a due vie tra codice non gestito e codice unity3d
risposta
Ecco un vecchio esempio che ho, basato su this post. Quello che vuoi è passare il tuo delegato C# a C++ come puntatore a funzione. Puoi memorizzare quel puntatore di funzione per usarlo dal tuo pulsante, o qualsiasi altra cosa desideri.
DLL C++:
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# Caller:
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;
}
}
Nel mio esempio, il ++ DLL C chiama immediatamente il C# richiamata con un valore di 42. incrementi di callback C# s 'questo valore di 1 e lo restituisce a C++ che a sua volta lo restituisce a C# nel sito di chiamata CallbackExample
.
Unity non piace quando si tenta di accedere al motore al di fuori del thread principale, quindi non sono sicuro di cosa succede se la DLL del C++ ha richiami asincroni a C#. Nel mio esempio le chiamate iniziano nel thread dell'unità principale quindi non ci sono problemi. Ti suggerirei di non consentire alcuna funzionalità specifica di Unity nel callback C#, invece di utilizzare il callback per impostare un booleano (o qualche altro meccanismo) da utilizzare da Update
per implementare qualsiasi cosa desideri dal motore Unity.
- 1. Differenza tra codice nativo e codice gestito?
- 2. Prestazioni di richiamo del codice non gestito dal codice gestito
- 3. Come utilizzare il codice gestito dal codice non gestito?
- 4. Utilizzo del codice non gestito dal codice gestito
- 5. Qual è la differenza tra codice non sicuro e codice non gestito in C#?
- 6. Multi Pass - matrice bidimensionale da codice gestito a codice non gestito
- 7. esegue il debug del codice C++ gestito e del codice C++ non gestito in una soluzione
- 8. comunicazione tra due script python
- 9. Sviluppo di due app Android e comunicazione tra due
- 10. Analisi metrica codice per codice C++ non gestito
- 11. Debug del codice non gestito durante il debug del codice gestito
- 12. durante la chiamata di codice non gestito dal codice gestito in Windows 7
- 13. Come terminare un thread gestito bloccato nel codice non gestito?
- 14. Autenticazione ssl a due vie per matraccio
- 15. Chiamare una dll C++ (codice non gestito) da un servizio Windows C# (scritto nel codice gestito)
- 16. Textbox binding a due vie non attivante
- 17. Mantenimento di una relazione a due vie tra le classi
- 18. Comunicazione Android tra due applicazioni
- 19. Comunicazione tra due dispositivi iOS
- 20. Pass socket da. NET a codice C++ non gestito
- 21. Il codice gestito dovrebbe restituire un errore o generare eccezioni al codice non gestito?
- 22. comunicazione tra due app flessibili
- 23. Android - comunicazione tra due dispositivi
- 24. Comunicazione tra processi C# e applicazione C++ non gestita
- 25. AngularJS 1.4 direttive: scope, a due vie vincolante e bindToController
- 26. comunicazione a due vie con gli oggetti lato server per lo sviluppo web-application
- 27. Associazione a due vie in RxSwift
- 28. Come condividere il codice tra due progetti?
- 29. Che cos'è Oauth a due vie
- 30. Utilizzare le proprietà C# nel codice C++ non gestito