Самый простой способ - использовать отражение, чтобы получить доступ к этому внутреннему конструктору:
internal Song(string name, string filename, int duration);
Вот код, который делает именно это:
var ctor = typeof(Song).GetConstructor(
BindingFlags.NonPublic | BindingFlags.Instance, null,
new[] { typeof(string), typeof(string), typeof(int) }, null);
song = (Song)ctor.Invoke(new object[] { "name", @"C:\My Music\Blah.mp3", 0 });
Очевидно, что это не такдействительно идеально.Я не думаю, что среда выполнения XNA обновляет второстепенные версии (то есть, если ваша игра использует XNA 4.0, она всегда одинакова), но я точно не знаю.Благодаря использованию внутреннего конструктора ваша игра полностью зависит от бинарных обновлений от Microsoft.Вам, вероятно, нужен хороший большой обработчик исключений для этого.
Кроме того, я обнаружил, что некоторые MP3-файлы (в буквальном смысле) не воспроизводятся в буквальном смысле.Кроме того, свойство Duration
явно не заполняется этим методом.
(Очевидно, это код только для Windows. Но вы все равно не можете получить доступ к случайным битам файловой системы, подобным этому, в WP7 или Xbox.)