Ich habe den folgenden Code geschrieben, der .net4 zum Ausführen verwendet. Da ich diesen Code in Unity3D verwende, der .net4 nicht unterstützt, musste ich ihn in nativen Code konvertieren. Ich verwende "Unmanaged Exports", um es in eine native Bibliothek zu exportieren.Ereignisse in nativer Bibliothek erstellt von "Unmanaged Exports" in C#
Ich kann diese Funktion von Unity3D aufrufen und es funktioniert gut.
Jetzt möchte ich Ereignisse zu meiner Bibliothek hinzufügen und dann auf diese Ereignisse von einem anderen C# -Code in Unity3D zugreifen. Meine Frage ist: Wie erstelle ich ein Callback-Event und registriere eine Funktion in meiner Bibliothek, um sie aufzurufen, wenn sie fertig ist? Ich weiß, wie man ein Ereignis in einem verwalteten C# -Code erstellt. Aber beachte, dass ich es hier in nativen Code exportiere und das Event im nativen Code verwenden muss. Also, Meine Bibliothek tut etwas wie ein nativer Code und dann möchte ich, dass es eine Callback-Funktion auslöst, um Unity3D mitzuteilen, dass es getan ist.
Hier ist meine Bibliothek Code:
[DllExport("SayText", CallingConvention = CallingConvention.Cdecl)]
public static void SayText()
{
var task = new Task(() =>
{
var synth = new SpeechSynthesizer();
synth.SetOutputToNull();
synth.SetOutputToWaveFile("D:\\test3.wav");
synth.SpeakCompleted += SynthOnSpeakCompleted;
synth.SpeakAsync("This is a test text");
});
task.Start();
}
private static void SynthOnSpeakCompleted(object sender, SpeakCompletedEventArgs speakCompletedEventArgs)
{
var synth = (SpeechSynthesizer)sender;
synth.SpeakCompleted -= SynthOnSpeakCompleted;
synth.SetOutputToDefaultAudioDevice();
// I want to trigger an event here so the application knows that the file has been created.
}
Und hier ist, wie ich diese Funktion von Unity3D bin Aufruf:
[DllImport("mylib", EntryPoint = "SayText")]
public static extern void SayText();
Vielen Dank für Ihre Antwort, aber meine Frage ist, wie Sie eine Callback-Funktion in C# (Unity) definieren und aus der Bibliothek aufrufen (C# .net 4 in native Bibliothek exportiert). Ich meine, wie man ein Funktions-Handle an die Bibliothek sendet und wie man es aufruft. Beide in C#, eins in der Einheit, eins ist ms C#. Beachten Sie, dass mein MS C# -Code nicht verwaltet wird. – FSFisGOOD