2015-07-07 4 views
1

Я пытаюсь перебрать все свои Playbackdevices на своем ПК, используя библиотеку Naudio.Переопределение свойств structs

код действительно прямо вперед:

for (int i = 0; i < WaveOut.DeviceCount; i++) 
    { 
     WaveOutCapabilities WOC = WaveOut.GetCapabilities(i); 
     MessageBox.Show(WOC.ProductName); 
    } 

Хотя, у меня проблема, где const int в структуры в основном отрезав ProductName-строку, если она имеет более чем 32 символов, которая довольно раздражает.

Так что мне интересно, как я мог бы изменить эту длину 32 символа на более крупную, которая соответствовала бы каждому ProductName. Единственное, о чем я мог подумать, это переопределить всю структуру (или просто число 32 до более крупного), но это невозможно. Как мне изменить значение?

Вы можете увидеть-структуру here (это private const int MaxProductNameLength = 32;, что должно быть изменено)

Я никогда не должен делал ничего подобного раньше, и мне интересно, даже возможно ли это.

+1

Самый простой способ - загрузить источник для Naudio и скомпилировать его для себя. – DavidG

+0

@DavidG Ах, да. Это, наверное, то, что я должен буду сделать. Но стало очень интересно, если вы действительно можете это сделать. – Tokfrans

+1

Ну, все зависит от того, может ли Windows API обрабатывать большее значение, чем 32. Он выглядит довольно хорошо определенным в документах. – DavidG

ответ

0

Вы не можете. Значение const оценивается во время компиляции. К моменту, когда ваш код взаимодействует с библиотекой, уже слишком поздно.

Обратите внимание, что даже если бы вы могли изменить значение const, его использование в библиотеке также оценивается во время компиляции. То есть атрибут [MarshalAs], где он используется, уже определен. Поэтому изменение значения const не повлияло бы на то, как это поле маршалируется.

Как уже отмечали некоторые комментаторы, с некоторой обширной модификацией исходной библиотеки (которая является открытым исходным кодом?), Возможно, вы сможете поддерживать более длинные имена, хотя это все еще не так, как это видно для базового API платформы.

В качестве альтернативы вы можете просто добавить свою собственную обертку вокруг нее. То есть используйте 32 символа, разрешенных в библиотеке для хранения целочисленного значения в виде строки, а затем в другом месте сопоставьте это строковое форматированное целое число с более длинной строкой, если необходимо, и вернитесь к целочисленному строковому форматированию из более длинной строки, а также при необходимости.

Вы можете сгенерировать целые числа с простым статическим полем int, которое вы увеличиваете каждый раз, когда вам нужно новое значение (т. Е. Когда вы пытаетесь сопоставить более длинную строку с целым числом в форме строки и не можете найти совпадение) ,

I.e. при вызове в библиотеку, перейдите от более длинного имени вашего собственного кода к целочисленному строковому форматированию. При получении информации из библиотеки, которая использует целое число в формате строки, сопоставьте это с длинным именем своего собственного кода. Вы можете использовать словари для обоих направлений.

Смежные вопросы