channel.setCallback(channelCallback);
Это проблема. FMod - неуправляемый код. Здесь вы создаете объект-делегат и передаете его неуправляемому коду. Проблема в том, что сборщик мусора не может отслеживать ссылки, хранящиеся в собственном коде. Следующая мусорная коллекция найдет no ссылки на объект и соберет его. Kaboom, когда нативный код выполняет обратный вызов.
Вам нужно сохранить ссылку самостоятельно, чтобы этого не произошло:
public class Music
{
private SomeDelegateType callback
//...
public Music(string file)
{
File = file;
callback = new SomeDelegateType(channelCallback);
}
public virtual void Play()
{
Audio.System.playSound(channel == null ? CHANNELINDEX.FREE : CHANNELINDEX.REUSE, music, false, ref channel);
music.addSyncPoint(500, TIMEUNIT.MS, "wooo", ref syncPtr);
channel.setCallback(callback);
}
Вам нужно найти фактический тип делегата из Код обертки FMod, я просто догадывался о «SomeDelegateType».
Из этот ответ : Когда вы используете оператор импорта, он всегда ищет фактический путь к модулю (и / или sys.modules); он не использует объекты модуля в локальном пространстве имен, которые существуют из-за предыдущего импорта.
Поэтому, если вы хотите использовать какой-либо объект из urllib, вам нужно ввести фактические объекты, которые вы хотите использовать:
import urllib.request
Вы также можете сделать что:
from urllib import request
fhand = request.urlopen('http://data.pr4e.org/romeo.txt')
Кажется, это работает:
from urllib import request
fhand = request.urlopen('http://data.pr4e.org/romeo.txt')
for line in fhand:
print(line.decode().strip())
Вам нужно использовать другие модули: urllib.parse и urllib.error? в противном случае это выглядит нормально.